From 9aeb12428a9a254c72e315ac7b07b912d6757ac9 Mon Sep 17 00:00:00 2001 From: "Benjamin Jakimow benjamin.jakimow@geo.hu-berlin.de" <benjamin.jakimow@geo.hu-berlin.de> Date: Thu, 8 Oct 2020 15:33:39 +0200 Subject: [PATCH] fixed current profiles signaling fixed scaling bug in profileviewdock.ui removed qtcharts.py Signed-off-by: Benjamin Jakimow benjamin.jakimow@geo.hu-berlin.de <benjamin.jakimow@geo.hu-berlin.de> --- eotimeseriesviewer/main.py | 26 +++++-- eotimeseriesviewer/mapvisualization.py | 52 ++++++++------ eotimeseriesviewer/profilevisualization.py | 7 +- eotimeseriesviewer/qtcharts.py | 81 ---------------------- eotimeseriesviewer/ui/profileviewdock.ui | 14 ++-- 5 files changed, 65 insertions(+), 115 deletions(-) delete mode 100644 eotimeseriesviewer/qtcharts.py diff --git a/eotimeseriesviewer/main.py b/eotimeseriesviewer/main.py index 27972379..761e7033 100644 --- a/eotimeseriesviewer/main.py +++ b/eotimeseriesviewer/main.py @@ -59,7 +59,7 @@ from eotimeseriesviewer.temporalprofiles import TemporalProfileLayer from eotimeseriesviewer.mapvisualization import MapView, MapWidget import eotimeseriesviewer.settings as eotsvSettings from .externals.qps.speclib.core import SpectralProfile, SpectralLibrary -from .externals.qps.speclib.gui import SpectralLibraryPanel +from .externals.qps.speclib.gui import SpectralLibraryPanel, SpectralLibraryWidget from .externals.qps.maptools import MapTools, CursorLocationMapTool, QgsMapToolSelect, QgsMapToolSelectionHandler from .externals.qps.cursorlocationvalue import CursorLocationInfoModel, CursorLocationInfoDock from .externals.qps.vectorlayertools import VectorLayerTools @@ -522,7 +522,7 @@ class EOTimeSeriesViewer(QgisInterface, QObject): mw.sigSpatialExtentChanged.connect(self.timeSeries().setCurrentSpatialExtent) mw.sigVisibleDatesChanged.connect(self.timeSeries().setVisibleDates) mw.sigMapViewAdded.connect(self.onMapViewAdded) - mw.sigCurrentLocationChanged.connect( + mw.sigCurrentLocationChanged[QgsCoordinateReferenceSystem, QgsPointXY].connect( lambda crs, pt, canvas=mw: self.setCurrentLocation(SpatialPoint(crs, pt), mapCanvas=mw.currentMapCanvas())) mw.sigCurrentLayerChanged.connect(self.updateCurrentLayerActions) @@ -893,6 +893,11 @@ class EOTimeSeriesViewer(QgisInterface, QObject): """ return self.profileDock.temporalProfileLayer() + def spectralLibraryWidgets(self) -> typing.List[SpectralLibraryWidget]: + w = [] + w.append(self.ui.dockSpectralLibrary.SLW) + return w + def spectralLibrary(self) -> SpectralLibrary: """ Returns the SpectraLibrary of the SpectralLibrary dock @@ -1264,9 +1269,10 @@ class EOTimeSeriesViewer(QgisInterface, QObject): for lyr in sensorLayers: assert isinstance(lyr, SensorProxyLayer) p = SpectralProfile.fromRasterLayer(lyr, spatialPoint) + basename = os.path.basename(lyr.source()) if isinstance(p, SpectralProfile): p2 = p.copyFieldSubset(sl.fields()) - p2.setName('{} {}'.format(p.name(), tsd.date())) + p2.setName(f'{basename}') p2.setAttribute('date', '{}'.format(tsd.date())) p2.setAttribute('doy', int(tsd.doy())) p2.setAttribute('sensor', tsd.sensor().name()) @@ -1274,7 +1280,17 @@ class EOTimeSeriesViewer(QgisInterface, QObject): if self.mCurrentMapSpectraLoading == 'TOP': break - self.ui.dockSpectralLibrary.SLW.setCurrentSpectra(currentSpectra) + if len(currentSpectra) > 0: + self.setCurrentSpectralProfiles(currentSpectra) + + def setCurrentSpectralProfiles(self, spectra: typing.List[SpectralProfile]): + if not isinstance(spectra, list): + spectra = [spectra] + for s in spectra: + assert isinstance(s, SpectralProfile) + + for w in self.spectralLibraryWidgets(): + w.setCurrentProfiles(spectra) @pyqtSlot(SpatialPoint) def loadCurrentTemporalProfile(self, spatialPoint: SpatialPoint): @@ -1313,7 +1329,7 @@ class EOTimeSeriesViewer(QgisInterface, QObject): p2.setAttribute('doy', int(tsd.mDOY)) p2.setAttribute('sensor', tsd.mSensor.name()) profiles2.append(p2) - self.ui.dockSpectralLibrary.SLW.setCurrentSpectra(profiles2) + self.ui.dockSpectralLibrary.SLW.setCurrentSpectralProfiles(profiles2) elif mapToolKey == MapTools.CursorLocation: diff --git a/eotimeseriesviewer/mapvisualization.py b/eotimeseriesviewer/mapvisualization.py index 71f8db8d..536529b8 100644 --- a/eotimeseriesviewer/mapvisualization.py +++ b/eotimeseriesviewer/mapvisualization.py @@ -31,7 +31,7 @@ import traceback import typing import numpy as np - +import time import qgis.utils from qgis.PyQt.QtCore import \ Qt, QSize, pyqtSignal, QModelIndex, QTimer, QAbstractListModel @@ -1033,8 +1033,8 @@ class MapWidget(QFrame): self.tbSliderDate: QLabel - self.mCurrentMapView: MapView = None - self.mCurrentMapCanvas: MapCanvas = None + #self.mCurrentMapView: MapView = None + #self.mCurrentMapCanvas: MapCanvas = None self.mMapViews: typing.List[MapView] = [] self.mCanvases: typing.Dict[MapView, typing.List[MapCanvas]] = dict() @@ -1245,29 +1245,43 @@ class MapWidget(QFrame): Returns the active map canvas, i.e. the MapCanvas that was clicked last. :return: MapCanvas """ - return self.mCurrentMapCanvas + canvases = sorted(self.mapCanvases(), key=lambda c: c.property(KEY_LAST_CLICKED), reverse=True) + if len(canvases) > 0: + return canvases[0] + else: + return None def setCurrentMapCanvas(self, mapCanvas: MapCanvas): assert isinstance(mapCanvas, MapCanvas) - if mapCanvas != self.mCurrentMapCanvas: - assert mapCanvas in self.mapCanvases() - self.sigCurrentCanvasChanged.emit(mapCanvas) - if isinstance(mapCanvas.mapView(), MapView): - self.setCurrentMapView(mapCanvas.mapView()) + canvases = self.mapCanvases() + assert mapCanvas in canvases + mapCanvas.setProperty(KEY_LAST_CLICKED, time.time()) def currentMapView(self) -> MapView: """ Returns the last used map view, i.e. the last map view a canvas was clicked on or a layer was selected in :return: """ - return self.mCurrentMapView + return self.currentMapCanvas().mapView() def setCurrentMapView(self, mapView: MapView): - if mapView != self.mCurrentMapView: - assert isinstance(mapView, MapView) + assert isinstance(mapView, MapView) + lastCurrentMapCanvas = self.currentMapCanvas() + lastCurrentMapView = lastCurrentMapCanvas.mapView() + + if mapView != lastCurrentMapView: assert mapView in self.mapViews() - self.mCurrentMapView = mapView - self.sigCurrentMapViewChanged.emit(mapView) + + position = 0 + for i, c in enumerate(lastCurrentMapView): + if c == lastCurrentMapCanvas: + position = i + break + + canvases = mapView.mapCanvases() + if len(canvases) > 0: + position = min(position, len(canvases) - 1) + self.currentMapCanvas(canvases[position]) def writeXml(self, node: QDomElement, doc: QDomDocument) -> bool: """ @@ -1492,11 +1506,11 @@ class MapWidget(QFrame): def mapViewCanvases(self, mapView: MapView) -> typing.List[MapCanvas]: """ - Returns the MapCanvases related to a MapView + Returns the MapCanvases related to a MapView, sorted :param mapView: MapView :return: [list-of-MapCanvases] """ - return self.mCanvases[mapView] + return sorted(self.mCanvases[mapView], key=lambda c: c.tsd()) def moveToNextTSD(self): @@ -1608,10 +1622,8 @@ class MapWidget(QFrame): self.sigMapViewsChanged.emit() self.sigMapViewAdded.emit(mapView) - s = "" - - if not isinstance(self.mCurrentMapView, MapView): - self.mCurrentMapView = mapView + if len(self.mapViews()) == 1: + self.setCurrentMapView(mapView) return mapView diff --git a/eotimeseriesviewer/profilevisualization.py b/eotimeseriesviewer/profilevisualization.py index 691706d8..059a4b00 100644 --- a/eotimeseriesviewer/profilevisualization.py +++ b/eotimeseriesviewer/profilevisualization.py @@ -1372,6 +1372,9 @@ class DateTimeAxis(pg.AxisItem): return d + def tickFont(self): + return self.style.get('tickFont', None) + def drawPicture(self, p, axisSpec, tickSpecs, textSpecs): p.setRenderHint(p.Antialiasing, False) @@ -1389,8 +1392,8 @@ class DateTimeAxis(pg.AxisItem): p.drawLine(p1, p2) ## Draw all text - if self.tickFont is not None: - p.setFont(self.tickFont) + if self.tickFont() is not None: + p.setFont(self.tickFont()) p.setPen(self.pen()) # for rect, flags, text in textSpecs: diff --git a/eotimeseriesviewer/qtcharts.py b/eotimeseriesviewer/qtcharts.py deleted file mode 100644 index ec6064b6..00000000 --- a/eotimeseriesviewer/qtcharts.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Licensed under the terms of the MIT License -# Copyright (c) 2015 Pierre Raybaut - -""" -Simple example illustrating Qt Charts capabilities to plot curves with -a high number of points, using OpenGL accelerated series -""" - -import PyQt5.QtChart -from qgis.PyQt.QtGui import QPolygonF, QPainter -from qgis.PyQt.QtWidgets import QMainWindow - -import numpy as np - - -def series_to_polyline(xdata, ydata): - """Convert series data to QPolygon(F) polyline - - This code is derived from PythonQwt's function named - `qwt.plot_curve.series_to_polyline`""" - size = len(xdata) - polyline = QPolygonF(size) - pointer = polyline.data() - dtype, tinfo = np.float, np.finfo # integers: = np.int, np.iinfo - pointer.setsize(2 * polyline.size() * tinfo(dtype).dtype.itemsize) - memory = np.frombuffer(pointer, dtype) - memory[:(size - 1) * 2 + 1:2] = xdata - memory[1:(size - 1) * 2 + 2:2] = ydata - return polyline - - -class TestWindow(QMainWindow): - def __init__(self, parent=None): - super(TestWindow, self).__init__(parent=parent) - self.ncurves = 0 - self.chart = QChart() - self.chart.legend().hide() - self.view = QChartView(self.chart) - self.view.setRenderHint(QPainter.Antialiasing) - self.setCentralWidget(self.view) - - def set_title(self, title): - self.chart.setTitle(title) - - def add_data(self, xdata, ydata, color=None): - curve = QLineSeries() - pen = curve.pen() - if color is not None: - pen.setColor(color) - pen.setWidthF(.1) - curve.setPen(pen) - curve.setUseOpenGL(True) - curve.append(series_to_polyline(xdata, ydata)) - self.chart.addSeries(curve) - self.chart.createDefaultAxes() - self.ncurves += 1 - - -if __name__ == '__main__': - import sys - from qgis.PyQt.QtWidgets import QApplication - from qgis.PyQt.QtCore import Qt - from qgis.PyQt.QtChart import * - app = QApplication(sys.argv) - - window = TestWindow() - - npoints = 1000000 - xdata = np.linspace(0., 10., npoints) - window.add_data(xdata, np.sin(xdata), color=Qt.red) - window.add_data(xdata, np.cos(xdata), color=Qt.blue) - window.set_title("Simple example with %d curves of %d points " \ - "(OpenGL Accelerated Series)" \ - % (window.ncurves, npoints)) - window.setWindowTitle("Simple performance example") - window.show() - window.resize(500, 400) - - sys.exit(app.exec_()) \ No newline at end of file diff --git a/eotimeseriesviewer/ui/profileviewdock.ui b/eotimeseriesviewer/ui/profileviewdock.ui index 810e3847..0107887c 100644 --- a/eotimeseriesviewer/ui/profileviewdock.ui +++ b/eotimeseriesviewer/ui/profileviewdock.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>1116</width> - <height>393</height> + <height>331</height> </rect> </property> <property name="minimumSize"> @@ -140,7 +140,7 @@ <string>Temporal profile coordinates</string> </property> <property name="icon"> - <iconset resource="../../../QGIS/images/images.qrc"> + <iconset> <normaloff>:/images/themes/default/mActionOpenTable.svg</normaloff>:/images/themes/default/mActionOpenTable.svg</iconset> </property> </item> @@ -283,7 +283,7 @@ <property name="sizePolicy"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> - <verstretch>0</verstretch> + <verstretch>1</verstretch> </sizepolicy> </property> <property name="orientation"> @@ -465,7 +465,7 @@ </widget> <action name="actionRefresh2D"> <property name="icon"> - <iconset resource="../../../QGIS/images/images.qrc"> + <iconset> <normaloff>:/images/themes/default/mActionReload.svg</normaloff>:/images/themes/default/mActionReload.svg</iconset> </property> <property name="text"> @@ -477,7 +477,7 @@ </action> <action name="actionAddStyle2D"> <property name="icon"> - <iconset resource="../../../QGIS/images/images.qrc"> + <iconset> <normaloff>:/images/themes/default/mActionAdd.svg</normaloff>:/images/themes/default/mActionAdd.svg</iconset> </property> <property name="text"> @@ -489,7 +489,7 @@ </action> <action name="actionRemoveStyle2D"> <property name="icon"> - <iconset resource="../../../QGIS/images/images.qrc"> + <iconset> <normaloff>:/images/themes/default/mActionRemove.svg</normaloff>:/images/themes/default/mActionRemove.svg</iconset> </property> <property name="text"> @@ -537,7 +537,7 @@ </action> <action name="actionSaveTemporalProfiles"> <property name="icon"> - <iconset resource="../../../QGIS/images/images.qrc"> + <iconset> <normaloff>:/images/themes/default/mActionFileSaveAs.svg</normaloff>:/images/themes/default/mActionFileSaveAs.svg</iconset> </property> <property name="text"> -- GitLab