feature/port-to-py3 #11

Merged
marcel merged 59 commits from feature/port-to-py3 into develop 2022-03-21 15:30:06 +01:00
2 changed files with 187 additions and 23 deletions
Showing only changes of commit 0c43040faf - Show all commits

118
pylot.yml Normal file
View File

@ -0,0 +1,118 @@
name: pylot_py35
channels:
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1=conda_forge
- _openmp_mutex=4.5=1_gnu
- brotlipy=0.7.0=py36h8f6f2f9_1001
- c-ares=1.17.1=h7f98852_1
- ca-certificates=2021.5.30=ha878542_0
- cartopy=0.18.0=py36h104b3a8_13
- certifi=2021.5.30=py36h5fab9bb_0
- cffi=1.14.5=py36hc120d54_0
- chardet=4.0.0=py36h5fab9bb_1
- cryptography=3.4.6=py36hb60f036_0
- cycler=0.10.0=py_2
- dbus=1.13.6=hfdff14a_1
- decorator=4.4.2=py_0
- expat=2.2.10=h9c3ff4c_0
- fontconfig=2.13.1=hba837de_1004
- freetype=2.10.4=h0708190_1
- future=0.18.2=py36h5fab9bb_3
- geos=3.9.1=h9c3ff4c_2
- gettext=0.19.8.1=h0b5b191_1005
- glib=2.68.0=h9c3ff4c_1
- glib-tools=2.68.0=h9c3ff4c_1
- greenlet=1.0.0=py36hc4f0c31_0
- gst-plugins-base=1.18.4=h29181c9_0
- gstreamer=1.18.4=h76c114f_0
- icu=68.1=h58526e2_0
- idna=2.10=pyh9f0ad1d_0
- importlib-metadata=3.7.3=py36h5fab9bb_0
- jpeg=9d=h36c2ea0_0
- kiwisolver=1.3.1=py36h605e78d_1
- krb5=1.17.2=h926e7f8_0
- lcms2=2.12=hddcbb42_0
- ld_impl_linux-64=2.35.1=hea4e1c9_2
- libblas=3.9.0=8_openblas
- libcblas=3.9.0=8_openblas
- libclang=11.1.0=default_ha53f305_0
- libcurl=7.75.0=hc4aaa36_0
- libedit=3.1.20191231=he28a2e2_2
- libev=4.33=h516909a_1
- libevent=2.1.10=hcdb4288_3
- libffi=3.3=h58526e2_2
- libgcc-ng=9.3.0=h2828fa1_18
- libgfortran-ng=9.3.0=hff62375_18
- libgfortran5=9.3.0=hff62375_18
- libglib=2.68.0=h3e27bee_1
- libgomp=9.3.0=h2828fa1_18
- libiconv=1.16=h516909a_0
- liblapack=3.9.0=8_openblas
- libllvm11=11.1.0=hf817b99_0
- libnghttp2=1.43.0=h812cca2_0
- libopenblas=0.3.12=pthreads_h4812303_1
- libpng=1.6.37=h21135ba_2
- libpq=13.1=hfd2b0eb_2
- libssh2=1.9.0=ha56f1ee_6
- libstdcxx-ng=9.3.0=h6de172a_18
- libtiff=4.2.0=hdc55705_0
- libuuid=2.32.1=h7f98852_1000
- libwebp-base=1.2.0=h7f98852_2
- libxcb=1.13=h7f98852_1003
- libxkbcommon=1.0.3=he3ba5ed_0
- libxml2=2.9.10=h72842e0_3
- libxslt=1.1.33=h15afd5d_2
- lxml=4.6.2=py36h04a5ba7_1
- lz4-c=1.9.3=h9c3ff4c_0
- matplotlib-base=3.3.4=py36hd391965_0
- mysql-common=8.0.23=ha770c72_1
- mysql-libs=8.0.23=h935591d_1
- ncurses=6.2=h58526e2_4
- nspr=4.30=h9c3ff4c_0
- nss=3.63=hb5efdd6_0
- numpy=1.19.5=py36h2aa4a07_1
- obspy=1.2.2=py36h785e9b2_0
- olefile=0.46=pyh9f0ad1d_1
- openssl=1.1.1k=h7f98852_0
- pandas=1.1.5=py36h284efc9_0
- pcre=8.44=he1b5a44_0
- pillow=8.1.2=py36ha6010c0_0
- pip=21.0.1=pyhd8ed1ab_0
- proj=7.2.0=h277dcde_2
- pthread-stubs=0.4=h36c2ea0_1001
- pycparser=2.20=pyh9f0ad1d_2
- pyopenssl=20.0.1=pyhd8ed1ab_0
- pyparsing=2.4.7=pyh9f0ad1d_0
- pyqt5-sip=4.19.18=py36hc4f0c31_7
- pyqtgraph=0.11.1=pyhd3deb0d_0
- pyshp=2.1.3=pyh44b312d_0
- pyside2=5.13.2=py36h6b97533_4
- pysocks=1.7.1=py36h5fab9bb_3
- python=3.6.13=hffdb5ce_0_cpython
- python-dateutil=2.8.1=py_0
- python_abi=3.6=1_cp36m
- pytz=2021.1=pyhd8ed1ab_0
- qt=5.12.9=hda022c4_4
- qtpy=1.9.0=py_0
- readline=8.0=he28a2e2_2
- requests=2.25.1=pyhd3deb0d_0
- scipy=1.5.3=py36h9e8f40b_0
- setuptools=49.6.0=py36h5fab9bb_3
- shapely=1.7.1=py36h93b233e_4
- six=1.15.0=pyh9f0ad1d_0
- sqlalchemy=1.4.2=py36h8f6f2f9_0
- sqlite=3.34.0=h74cdb3f_0
- tk=8.6.10=h21135ba_1
- tornado=6.1=py36h8f6f2f9_1
- typing_extensions=3.7.4.3=py_0
- urllib3=1.26.4=pyhd8ed1ab_0
- wheel=0.36.2=pyhd3deb0d_0
- xorg-libxau=1.0.9=h7f98852_0
- xorg-libxdmcp=1.1.3=h7f98852_0
- xz=5.2.5=h516909a_1
- zipp=3.4.1=pyhd8ed1ab_0
- zlib=1.2.11=h516909a_1010
- zstd=1.4.9=ha95c52a_0
prefix: /home/kaan/.conda/envs/pylot_py35

View File

@ -12,6 +12,7 @@ from PySide2.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.patheffects as PathEffects
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
@ -39,8 +40,10 @@ class MplCanvas(FigureCanvas):
class Array_map(QtWidgets.QWidget):
def __init__(self, parent, metadata, parameter=None, figure=None, annotate=True, pointsize=25.,
linewidth=1.5, width=5e6, height=2e6):
super(Array_map, self).__init__(parent)
# super(Array_map, self).__init__(parent)
QtWidgets.QWidget.__init__(self)
assert (parameter != None or parent != None), 'either parent or parameter has to be set'
# set properties
self._parent = parent
self.metadata = metadata
@ -65,13 +68,20 @@ class Array_map(QtWidgets.QWidget):
self.init_graphics()
self.init_stations()
self.init_crtpyMap()
self.init_colormap()
self.draw_everything()
self.init_map()
# set original map limits to fall back on when home button is pressed
self.org_xlim = self.canvas.axes.get_xlim()
self.org_ylim = self.canvas.axes.get_ylim()
self._style = None if not hasattr(parent, '_style') else parent._style
self.show()
def init_map(self):
self.init_colormap()
self.connectSignals()
self.draw_everything()
def init_graphics(self):
"""
Initializes all GUI components and figure elements to be populeted by other functions
@ -82,6 +92,8 @@ class Array_map(QtWidgets.QWidget):
# initialize GUI elements
self.status_label = QtWidgets.QLabel()
self.map_reset_button = QtWidgets.QPushButton('Reset Map View')
self.map_reset_button.resize(150, 50)
self.main_box = QtWidgets.QVBoxLayout()
self.setLayout(self.main_box)
@ -121,10 +133,15 @@ class Array_map(QtWidgets.QWidget):
self.top_row.addWidget(self.refresh_button)
self.main_box.addWidget(self.plotWidget, 1)
self.main_box.addWidget(NavigationToolbar(self.plotWidget, self), 0)
# self.main_box.addWidget(self.map_reset_button, 0)
# self.main_box.addWidget(NavigationToolbar(self.plotWidget, self), 0)
# self.main_box.addWidget(self.status_label, 0)
self.connectSignals()
self.bot_row = QtWidgets.QHBoxLayout()
self.main_box.addLayout(self.bot_row, 0.3)
self.bot_row.addWidget(self.map_reset_button)
self.bot_row.addWidget(self.status_label)
# self.connectSignals()
def init_colormap(self):
self.init_lat_lon_dimensions()
@ -139,20 +156,43 @@ class Array_map(QtWidgets.QWidget):
self.canvas.axes.add_feature(cf.BORDERS, alpha=0.7)
# parallels and meridians
gridlines = self.canvas.axes.gridlines(draw_labels=True, alpha=0.5, zorder=7)
gridlines.xformatter = LONGITUDE_FORMATTER
gridlines.yformatter = LATITUDE_FORMATTER
self.add_merid_paral()
# self.canvas.axes.set_global()
self.canvas.fig.tight_layout()
# self.plotWidget.draw_idle()
def add_merid_paral(self):
self.gridlines = self.canvas.axes.gridlines(draw_labels=False, alpha=0.5, zorder=7)
# current cartopy version does not support label removal. Devs are working on it.
# Should be fixed with next cartopy version
# self.gridlines.xformatter = LONGITUDE_FORMATTER
# self.gridlines.yformatter = LATITUDE_FORMATTER
def remove_merid_paral(self):
if len(self.gridlines.xline_artists):
for i in self.gridlines.xline_artists:
i.remove()
# self.gridlines.xline_artists[0].remove()
# self.gridlines.yline_artists[0].remove()
def org_map_view(self):
self.canvas.axes.set_xlim(self.org_xlim[0], self.org_xlim[1])
self.canvas.axes.set_ylim(self.org_ylim[0], self.org_ylim[1])
# parallels and meridians
self.remove_merid_paral()
self.add_merid_paral()
self.canvas.axes.figure.canvas.draw_idle()
def connectSignals(self):
self.comboBox_phase.currentIndexChanged.connect(self._refresh_drawings)
self.comboBox_am.currentIndexChanged.connect(self._refresh_drawings)
self.cmaps_box.currentIndexChanged.connect(self._refresh_drawings)
kaan marked this conversation as resolved
Review

consider adding "TODO:" comment for future releases of cartopy

consider adding "TODO:" comment for future releases of cartopy
self.annotations_box.stateChanged.connect(self.switch_annotations)
self.refresh_button.clicked.connect(self._refresh_drawings)
self.map_reset_button.clicked.connect(self.org_map_view)
self.plotWidget.mpl_connect('motion_notify_event', self.mouse_moved)
self.plotWidget.mpl_connect('scroll_event', self.mouse_scroll)
self.plotWidget.mpl_connect('button_press_event', self.mouseLeftPress)
@ -162,7 +202,6 @@ class Array_map(QtWidgets.QWidget):
def mouse_moved(self, event):
if not event.inaxes == self.canvas.axes:
return
lat = event.ydata
lon = event.xdata
self.status_label.setText('Latitude: {}, Longitude: {}'.format(lat, lon))
@ -189,6 +228,10 @@ class Array_map(QtWidgets.QWidget):
self.canvas.axes.set_xlim(xl, xr)
self.canvas.axes.set_ylim(yb, yt)
# parallels and meridians
self.remove_merid_paral()
self.add_merid_paral()
self.canvas.axes.figure.canvas.draw_idle()
def mouseLeftPress(self, event):
@ -210,6 +253,10 @@ class Array_map(QtWidgets.QWidget):
self.canvas.axes.set_xlim((self.map_xlim[0] - dx, self.map_xlim[1] - dx))
self.canvas.axes.set_ylim(self.map_ylim[0] - dy, self.map_ylim[1] - dy)
# parallels and meridians
self.remove_merid_paral()
self.add_merid_paral()
self.canvas.axes.figure.canvas.draw_idle()
def onpick(self, event):
@ -223,6 +270,7 @@ class Array_map(QtWidgets.QWidget):
self.deletePick(ind)
elif button == 3:
self.pickInfo(ind)
# data handling -----------------------------------------------------
def update_hybrids_dict(self):
self.hybrids_dict = self.picks_dict.copy()
@ -387,18 +435,15 @@ class Array_map(QtWidgets.QWidget):
return picks, uncertainties, latitudes, longitudes
# plotting -----------------------------------------------------
def init_colormap(self):
self.init_lat_lon_dimensions()
self.init_lat_lon_grid()
def highlight_station(self, network, station, color):
stat_dict = self.stations_dict['{}.{}'.format(network, station)]
lat = stat_dict['latitude']
lon = stat_dict['longitude']
self.highlighted_stations.append(self.canvas.axes.scatter(lon, lat, s=self.pointsize, edgecolors=color,
facecolors='none', zorder=12, label='deleted'))
facecolors='none', zorder=12,
transform=ccrs.PlateCarree(), label='deleted'))
self.canvas.idle_draw()
# self.canvas.idle_draw()
def openPickDlg(self, ind):
data = self._parent.get_data().getWFData()
@ -463,7 +508,7 @@ class Array_map(QtWidgets.QWidget):
zorder=10, picker=True, edgecolor='0.5', label='Not Picked',
transform=ccrs.PlateCarree())
self.cid = self.canvas.mpl_connect('pick_event', self.onpick)
self.cid = self.plotWidget.mpl_connect('pick_event', self.onpick)
self._station_onpick_ids = stations
if self.eventLoc:
lats, lons = self.eventLoc
@ -485,10 +530,9 @@ class Array_map(QtWidgets.QWidget):
self.sc_picked = self.canvas.axes.scatter(lons, lats, s=sizes, edgecolors='white', cmap=cmap,
c=picks, zorder=11, label='Picked', transform=ccrs.PlateCarree())
def annotate_ax(self):
self.annotations = []
stations, xs, ys = self.get_st_lat_lon_for_plot()
stations, ys, xs = self.get_st_lat_lon_for_plot()
# MP MP testing station highlighting if they have high impact on mean gradient of color map
# if self.picks_rel:
# self.test_gradient()
@ -502,7 +546,9 @@ class Array_map(QtWidgets.QWidget):
if st in self.marked_stations:
color = 'red'
self.annotations.append(self.canvas.axes.annotate(' %s' % st, xy=(x, y), fontsize=self.pointsize / 4.,
fontweight='semibold', color=color, zorder=14))
fontweight='semibold', color=color,
transform=ccrs.PlateCarree(), zorder=14,
path_effects=[PathEffects.withStroke(linewidth=self.pointsize / 4., foreground='k')]))
self.legend = self.canvas.axes.legend(loc=1)
self.legend.get_frame().set_facecolor((1, 1, 1, 0.75))
@ -560,7 +606,7 @@ class Array_map(QtWidgets.QWidget):
self.comboBox_phase.setEnabled(False)
if self.annotate:
self.annotate_ax()
self.canvas.draw()
self.plotWidget.draw_idle()
def remove_drawings(self):
self.remove_annotations()
@ -584,7 +630,7 @@ class Array_map(QtWidgets.QWidget):
self.remove_contourf()
del self.contourf
if hasattr(self, 'cid'):
self.canvas.mpl_disconnect(self.cid)
self.plotWidget.mpl_disconnect(self.cid)
del self.cid
try:
self.sc.remove()
@ -594,7 +640,7 @@ class Array_map(QtWidgets.QWidget):
self.legend.remove()
except Exception as e:
print('Warning: could not remove legend. Reason: {}'.format(e))
self.canvas.draw()
self.plotWidget.draw_idle()
def remove_contourf(self):
for item in self.contourf.collections: