diff options
Diffstat (limited to 'silx/gui/plot/tools/profile/ScatterProfileToolBar.py')
-rw-r--r-- | silx/gui/plot/tools/profile/ScatterProfileToolBar.py | 179 |
1 files changed, 13 insertions, 166 deletions
diff --git a/silx/gui/plot/tools/profile/ScatterProfileToolBar.py b/silx/gui/plot/tools/profile/ScatterProfileToolBar.py index 0d30651..44187ef 100644 --- a/silx/gui/plot/tools/profile/ScatterProfileToolBar.py +++ b/silx/gui/plot/tools/profile/ScatterProfileToolBar.py @@ -30,20 +30,11 @@ __license__ = "MIT" __date__ = "28/06/2018" -import logging -import weakref +from silx.utils import deprecation +from . import toolbar -import numpy -from ._BaseProfileToolBar import _BaseProfileToolBar -from ... import items -from ....utils.concurrent import submitToQtMainThread - - -_logger = logging.getLogger(__name__) - - -class ScatterProfileToolBar(_BaseProfileToolBar): +class ScatterProfileToolBar(toolbar.ProfileToolBar): """QToolBar providing scatter plot profiling tools :param parent: See :class:`QToolBar`. @@ -51,157 +42,13 @@ class ScatterProfileToolBar(_BaseProfileToolBar): :param str title: See :class:`QToolBar`. """ - def __init__(self, parent=None, plot=None, title='Scatter Profile'): - super(ScatterProfileToolBar, self).__init__(parent, plot, title) - - self.__nPoints = 1024 - self.__scatterRef = None - self.__futureInterpolator = None - - plot = self.getPlotWidget() - if plot is not None: - self._setScatterItem(plot._getActiveItem(kind='scatter')) - plot.sigActiveScatterChanged.connect(self.__activeScatterChanged) - - def __activeScatterChanged(self, previous, legend): - """Handle change of active scatter - - :param Union[str,None] previous: - :param Union[str,None] legend: - """ - plot = self.getPlotWidget() - if plot is None or legend is None: - scatter = None - else: - scatter = plot.getScatter(legend) - self._setScatterItem(scatter) - - def _getScatterItem(self): - """Returns the scatter item currently handled by this tool. - - :rtype: ~silx.gui.plot.items.Scatter - """ - return None if self.__scatterRef is None else self.__scatterRef() - - def _setScatterItem(self, scatter): - """Set the scatter tracked by this tool - - :param Union[None,silx.gui.plot.items.Scatter] scatter: - """ - self.__futureInterpolator = None # Reset currently expected future - - previousScatter = self._getScatterItem() - if previousScatter is not None: - previousScatter.sigItemChanged.disconnect( - self.__scatterItemChanged) - - if scatter is None: - self.__scatterRef = None - else: - self.__scatterRef = weakref.ref(scatter) - scatter.sigItemChanged.connect(self.__scatterItemChanged) - - # Refresh profile - self.updateProfile() - - def __scatterItemChanged(self, event): - """Handle update of active scatter plot item - - :param ItemChangedType event: - """ - if event == items.ItemChangedType.DATA: - self.updateProfile() # Refresh profile - - def hasPendingOperations(self): - """Returns True if waiting for an interpolator to be ready - - :rtype: bool - """ - return (self.__futureInterpolator is not None and - not self.__futureInterpolator.done()) - - # Number of points - - def getNPoints(self): - """Returns the number of points of the profiles - - :rtype: int - """ - return self.__nPoints - - def setNPoints(self, npoints): - """Set the number of points of the profiles - - :param int npoints: - """ - npoints = int(npoints) - if npoints < 1: - raise ValueError("Unsupported number of points: %d" % npoints) - elif npoints != self.__nPoints: - self.__nPoints = npoints - self.updateProfile() - - # Overridden methods - - def computeProfileTitle(self, x0, y0, x1, y1): - """Compute corresponding plot title - - :param float x0: Profile start point X coord - :param float y0: Profile start point Y coord - :param float x1: Profile end point X coord - :param float y1: Profile end point Y coord - :return: Title to use - :rtype: str - """ - if self.hasPendingOperations(): - return 'Pre-processing data...' - else: - return super(ScatterProfileToolBar, self).computeProfileTitle( - x0, y0, x1, y1) - - def __futureDone(self, future): - """Handle completion of the interpolator creation""" - if future is self.__futureInterpolator: - # Only handle future callbacks for the current one - submitToQtMainThread(self.updateProfile) - - def computeProfile(self, x0, y0, x1, y1): - """Compute corresponding profile - - :param float x0: Profile start point X coord - :param float y0: Profile start point Y coord - :param float x1: Profile end point X coord - :param float y1: Profile end point Y coord - :return: (points, values) profile data or None - """ - scatter = self._getScatterItem() - if scatter is None or self.hasPendingOperations(): - return None - - # Lazy async request of the interpolator - future = scatter._getInterpolator() - if future is not self.__futureInterpolator: - # First time we request this interpolator - self.__futureInterpolator = future - if not future.done(): - future.add_done_callback(self.__futureDone) - return None - - if future.cancelled() or future.exception() is not None: - return None # Something went wrong - - interpolator = future.result() - if interpolator is None: - return None # Cannot init an interpolator - - nPoints = self.getNPoints() - points = numpy.transpose(( - numpy.linspace(x0, x1, nPoints, endpoint=True), - numpy.linspace(y0, y1, nPoints, endpoint=True))) - - values = interpolator(points) - - if not numpy.any(numpy.isfinite(values)): - return None # Profile outside convex hull - - return points, values + def __init__(self, parent=None, plot=None, title=None): + super(ScatterProfileToolBar, self).__init__(parent, plot) + if title is not None: + deprecation.deprecated_warning("Attribute", + name="title", + reason="removed", + since_version="0.13.0", + only_once=True, + skip_backtrace_count=1) + self.setScheme("scatter") |