From 93482da6b3390b88c5a0e7cbf0d2e7e971eaa82f Mon Sep 17 00:00:00 2001 From: Alix Damman Date: Tue, 12 Sep 2017 17:51:40 +0200 Subject: [PATCH 1/2] fix #66 : changed management of bg_value in Adapater and DataArrayModel --- larray_editor/api.py | 6 +++--- larray_editor/arrayadapter.py | 14 +++++++++++++- larray_editor/arraymodel.py | 22 ++++++++++++---------- larray_editor/arraywidget.py | 6 +++--- larray_editor/comparator.py | 2 +- 5 files changed, 32 insertions(+), 18 deletions(-) diff --git a/larray_editor/api.py b/larray_editor/api.py index 4e0eb51..b09cb88 100644 --- a/larray_editor/api.py +++ b/larray_editor/api.py @@ -352,15 +352,15 @@ def restore_display_hook(): # profile.runctx('edit(la.Session(arr2=arr2))', vars(), {}, # 'c:\\tmp\\edit.profile') - edit(ses) + # edit(ses) # edit(ses) # edit(file) # edit('fake_path') # edit(REOPEN_LAST_FILE) - # edit(arr2) + edit(arr2) # compare(la.Session(arr2=arr2, arr3=arr3), la.Session(arr2=arr2 + 1.0, arr3=arr3 + 1.0)) - # compare(arr2, arr2 + 1.0) + compare(arr3, arr3 + la.ndrange(arr3.axes)) # s = la.local_arrays() # view(s) diff --git a/larray_editor/arrayadapter.py b/larray_editor/arrayadapter.py index d4cba38..91e3dc6 100644 --- a/larray_editor/arrayadapter.py +++ b/larray_editor/arrayadapter.py @@ -83,6 +83,15 @@ def get_changes_2D(self): changes_2D[local_key] = v return changes_2D + def get_bg_value_2D(self, shape_2D): + if self.bg_value is not None: + filtered_bg_value = self.bg_value[self.current_filter] + if np.isscalar(filtered_bg_value): + filtered_bg_value = la.aslarray(filtered_bg_value) + return filtered_bg_value.data.reshape(shape_2D) + else: + return None + # XXX: or create two methods?: # - set_data (which reset the current filter) # - update_data (which sets new data but keeps current filter unchanged) @@ -93,8 +102,9 @@ def set_data(self, data, bg_gradient=None, bg_value=None, current_filter=None): self.current_filter = {} self.changes = {} self.la_data = la.aslarray(data) + self.bg_value = la.aslarray(bg_value) if bg_value is not None else None + self.bg_gradient = bg_gradient self.update_filtered_data(current_filter) - self.data_model.set_background(bg_gradient, bg_value) def update_filtered_data(self, current_filter=None): if current_filter is not None: @@ -113,10 +123,12 @@ def update_filtered_data(self, current_filter=None): ylabels = self.get_ylabels() data_2D = self.get_2D_data() changes_2D = self.get_changes_2D() + bg_value_2D = self.get_bg_value_2D(data_2D.shape) self.axes_model.set_data(axes) self.xlabels_model.set_data(xlabels) self.ylabels_model.set_data(ylabels) self.data_model.set_data(data_2D, changes_2D) + self.data_model.set_background(self.bg_gradient, bg_value_2D) def get_data(self): return self.la_data diff --git a/larray_editor/arraymodel.py b/larray_editor/arraymodel.py index 781335b..3874bc5 100644 --- a/larray_editor/arraymodel.py +++ b/larray_editor/arraymodel.py @@ -201,8 +201,8 @@ class DataArrayModel(AbstractArrayModel): Parent Widget. bg_gradient : LinearGradient, optional Background color gradient - bg_value : LArray, optional - Background color value + bg_value : Numpy ndarray, optional + Background color value. Must have the shape as data minvalue : scalar Minimum value allowed. maxvalue : scalar @@ -299,7 +299,14 @@ def set_format(self, format): self.reset() def set_background(self, bg_gradient=None, bg_value=None): - self.bg_gradient = bg_gradient + if bg_gradient is not None and not isinstance(bg_gradient, LinearGradient): + raise ValueError("Expected None or LinearGradient instance for `bg_gradient` argument") + if bg_value is not None and not (isinstance(bg_value, np.ndarray) and bg_value.ndim == 2): + raise ValueError("Expected None or 2D Numpy ndarray with shape {} for `bg_value` argument" + .format(self._data.shape)) + # self.bg_gradient must never be None + if bg_gradient is not None: + self.bg_gradient = bg_gradient self.bg_value = bg_value self.reset() @@ -349,13 +356,8 @@ def data(self, index, role=Qt.DisplayRole): if self.bg_value is None: return self.bg_gradient[float(self.color_func(value))] else: - bg_value = self.bg_value - x, y = index.row(), index.column() - # FIXME: this is buggy on filtered data. We should change - # bg_value when changing the filter. - idx = y + x * bg_value.shape[-1] - value = bg_value.data.flat[idx] - return self.bg_gradient[value] + i, j = index.row(), index.column() + return self.bg_gradient[self.bg_value[i][j]] # elif role == Qt.ToolTipRole: # return to_qvariant("{}\n{}".format(repr(value),self.get_labels(index))) return to_qvariant() diff --git a/larray_editor/arraywidget.py b/larray_editor/arraywidget.py index 079c356..a08ca22 100644 --- a/larray_editor/arraywidget.py +++ b/larray_editor/arraywidget.py @@ -504,12 +504,12 @@ def __init__(self, parent, data, readonly=False, bg_value=None, bg_gradient=None self.model_ylabels = LabelsArrayModel(parent=self, readonly=readonly) self.view_ylabels = LabelsView(parent=self, model=self.model_ylabels, position=(BOTTOM, LEFT)) - self.model_data = DataArrayModel(parent=self, readonly=readonly, bg_value=bg_value, bg_gradient=bg_gradient, - minvalue=minvalue, maxvalue=maxvalue) + self.model_data = DataArrayModel(parent=self, readonly=readonly, minvalue=minvalue, maxvalue=maxvalue) self.view_data = DataView(parent=self, model=self.model_data, dtype=data.dtype, shape=data.shape) self.data_adapter = LArrayDataAdapter(axes_model=self.model_axes, xlabels_model=self.model_xlabels, - ylabels_model=self.model_ylabels, data_model=self.model_data, data=data) + ylabels_model=self.model_ylabels, data_model=self.model_data, data=data, + bg_value=bg_value, bg_gradient=bg_gradient) # Create vertical and horizontal scrollbars self.vscrollbar = ScrollBar(self, self.view_data.verticalScrollBar()) diff --git a/larray_editor/comparator.py b/larray_editor/comparator.py index a8380eb..2bbbcc4 100644 --- a/larray_editor/comparator.py +++ b/larray_editor/comparator.py @@ -54,7 +54,7 @@ def setup_and_check(self, arrays, names, title=''): layout.addLayout(maxdiff_layout) if absmax: - # scale diff to 0-1 + # scale diff to range 0-1 bg_value = (diff / absmax) / 2 + 0.5 else: # all 0.5 (white) From bda109b1c16ac29a2f324825d3a7d0fe5a089481 Mon Sep 17 00:00:00 2001 From: Alix Damman Date: Wed, 13 Sep 2017 12:34:22 +0200 Subject: [PATCH 2/2] updated previous commit --- larray_editor/arraymodel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/larray_editor/arraymodel.py b/larray_editor/arraymodel.py index 3874bc5..183ad98 100644 --- a/larray_editor/arraymodel.py +++ b/larray_editor/arraymodel.py @@ -301,7 +301,7 @@ def set_format(self, format): def set_background(self, bg_gradient=None, bg_value=None): if bg_gradient is not None and not isinstance(bg_gradient, LinearGradient): raise ValueError("Expected None or LinearGradient instance for `bg_gradient` argument") - if bg_value is not None and not (isinstance(bg_value, np.ndarray) and bg_value.ndim == 2): + if bg_value is not None and not (isinstance(bg_value, np.ndarray) and bg_value.shape == self._data.shape): raise ValueError("Expected None or 2D Numpy ndarray with shape {} for `bg_value` argument" .format(self._data.shape)) # self.bg_gradient must never be None @@ -357,7 +357,7 @@ def data(self, index, role=Qt.DisplayRole): return self.bg_gradient[float(self.color_func(value))] else: i, j = index.row(), index.column() - return self.bg_gradient[self.bg_value[i][j]] + return self.bg_gradient[self.bg_value[i, j]] # elif role == Qt.ToolTipRole: # return to_qvariant("{}\n{}".format(repr(value),self.get_labels(index))) return to_qvariant()