Commit a167122e980405f749a7826c93060379eec310cb

Authored by Thiago Franco de Moraes
1 parent 04381202
Exists in threshold_history

Starting to support undo and redo threshold changing

invesalius/data/mask.py
... ... @@ -31,6 +31,16 @@ import imagedata_utils as iu
31 31  
32 32 from wx.lib.pubsub import pub as Publisher
33 33  
  34 +class ThresholdHistoryNode(object):
  35 + def __init__(self, threshold):
  36 + self.threshold = threshold
  37 +
  38 + def commit_history(self, mask):
  39 + #Publisher.sendMessage('Changing threshold values', self.threshold)
  40 + mask.threshold_range = self.threshold
  41 + Publisher.sendMessage('Set threshold values no history', self.threshold)
  42 + Publisher.sendMessage('Reload actual slice')
  43 +
34 44  
35 45 class EditionHistoryNode(object):
36 46 def __init__(self, index, orientation, array, clean=False):
... ... @@ -45,7 +55,8 @@ class EditionHistoryNode(object):
45 55 numpy.save(self.filename, array)
46 56 print "Saving history", self.index, self.orientation, self.filename, self.clean
47 57  
48   - def commit_history(self, mvolume):
  58 + def commit_history(self, mask):
  59 + mvolume = mask.matrix
49 60 array = numpy.load(self.filename)
50 61 if self.orientation == 'AXIAL':
51 62 mvolume[self.index+1,1:,1:] = array
... ... @@ -84,6 +95,10 @@ class EditionHistory(object):
84 95 node = EditionHistoryNode(index, orientation, array, clean)
85 96 self.add(node)
86 97  
  98 + def new_theshold_node(self, threshold):
  99 + node = ThresholdHistoryNode(threshold)
  100 + self.add(node)
  101 +
87 102 def add(self, node):
88 103 if self.index == self.size:
89 104 self.history.pop(0)
... ... @@ -98,50 +113,60 @@ class EditionHistory(object):
98 113 Publisher.sendMessage("Enable undo", True)
99 114 Publisher.sendMessage("Enable redo", False)
100 115  
101   - def undo(self, mvolume, actual_slices=None):
  116 + def undo(self, mask, actual_slices=None):
102 117 h = self.history
103 118 if self.index > 0:
104   - #if self.index > 0 and h[self.index].clean:
105   - ##self.index -= 1
106   - ##h[self.index].commit_history(mvolume)
107   - #self._reload_slice(self.index - 1)
108   - if actual_slices and actual_slices[h[self.index - 1].orientation] != h[self.index - 1].index:
109   - self._reload_slice(self.index - 1)
  119 + if isinstance(h[self.index], EditionHistoryNode):
  120 + #if self.index > 0 and h[self.index].clean:
  121 + ##self.index -= 1
  122 + ##h[self.index].commit_history(mvolume)
  123 + #self._reload_slice(self.index - 1)
  124 + if actual_slices and actual_slices[h[self.index - 1].orientation] != h[self.index - 1].index:
  125 + self._reload_slice(self.index - 1)
  126 + else:
  127 + self.index -= 1
  128 + h[self.index].commit_history(mask)
  129 + if actual_slices and self.index and actual_slices[h[self.index - 1].orientation] == h[self.index - 1].index:
  130 + self.index -= 1
  131 + h[self.index].commit_history(mask)
  132 + self._reload_slice(self.index)
  133 + Publisher.sendMessage("Enable redo", True)
110 134 else:
111 135 self.index -= 1
112   - h[self.index].commit_history(mvolume)
113   - if actual_slices and self.index and actual_slices[h[self.index - 1].orientation] == h[self.index - 1].index:
114   - self.index -= 1
115   - h[self.index].commit_history(mvolume)
116   - self._reload_slice(self.index)
  136 + h[self.index].commit_history(mask)
117 137 Publisher.sendMessage("Enable redo", True)
118 138  
119 139 if self.index == 0:
120 140 Publisher.sendMessage("Enable undo", False)
121   - print "AT", self.index, len(self.history), self.history[self.index].filename
  141 + #print "AT", self.index, len(self.history), self.history[self.index].filename
122 142  
123   - def redo(self, mvolume, actual_slices=None):
  143 + def redo(self, mask, actual_slices=None):
124 144 h = self.history
125 145 if self.index < len(h) - 1:
126   - #if self.index < len(h) - 1 and h[self.index].clean:
127   - ##self.index += 1
128   - ##h[self.index].commit_history(mvolume)
129   - #self._reload_slice(self.index + 1)
130   -
131   - if actual_slices and actual_slices[h[self.index + 1].orientation] != h[self.index + 1].index:
132   - self._reload_slice(self.index + 1)
  146 + if isinstance(h[self.index], EditionHistoryNode):
  147 + #if self.index < len(h) - 1 and h[self.index].clean:
  148 + ##self.index += 1
  149 + ##h[self.index].commit_history(mvolume)
  150 + #self._reload_slice(self.index + 1)
  151 +
  152 + if actual_slices and actual_slices[h[self.index + 1].orientation] != h[self.index + 1].index:
  153 + self._reload_slice(self.index + 1)
  154 + else:
  155 + self.index += 1
  156 + h[self.index].commit_history(mask)
  157 + if actual_slices and self.index < len(h) - 1 and actual_slices[h[self.index + 1].orientation] == h[self.index + 1].index:
  158 + self.index += 1
  159 + h[self.index].commit_history(mask)
  160 + self._reload_slice(self.index)
  161 + Publisher.sendMessage("Enable undo", True)
133 162 else:
134 163 self.index += 1
135   - h[self.index].commit_history(mvolume)
136   - if actual_slices and self.index < len(h) - 1 and actual_slices[h[self.index + 1].orientation] == h[self.index + 1].index:
137   - self.index += 1
138   - h[self.index].commit_history(mvolume)
139   - self._reload_slice(self.index)
  164 + h[self.index].commit_history(mask)
140 165 Publisher.sendMessage("Enable undo", True)
141 166  
142 167 if self.index == len(h) - 1:
143 168 Publisher.sendMessage("Enable redo", False)
144   - print "AT", self.index, len(h), h[self.index].filename
  169 + #print "AT", self.index, len(h), h[self.index].filename
145 170  
146 171 def _reload_slice(self, index):
147 172 Publisher.sendMessage(('Set scroll position', self.history[index].orientation),
... ... @@ -191,14 +216,17 @@ class Mask():
191 216 Publisher.subscribe(self.OnFlipVolume, 'Flip volume')
192 217 Publisher.subscribe(self.OnSwapVolumeAxes, 'Swap volume axes')
193 218  
194   - def save_history(self, index, orientation, array, p_array, clean=False):
  219 + def save_edition_history(self, index, orientation, array, p_array, clean=False):
195 220 self.history.new_node(index, orientation, array, p_array, clean)
196 221  
  222 + def save_threshold_history(self, threshold):
  223 + self.history.new_theshold_node(threshold)
  224 +
197 225 def undo_history(self, actual_slices):
198   - self.history.undo(self.matrix, actual_slices)
  226 + self.history.undo(self, actual_slices)
199 227  
200 228 def redo_history(self, actual_slices):
201   - self.history.redo(self.matrix, actual_slices)
  229 + self.history.redo(self, actual_slices)
202 230  
203 231 def on_show(self):
204 232 self.history._config_undo_redo(self.is_shown)
... ...
invesalius/data/slice_.py
... ... @@ -258,7 +258,7 @@ class Slice(object):
258 258 index = self.current_mask.index
259 259 self.num_gradient += 1
260 260 self.current_mask.matrix[:] = 0
261   - self.current_mask.clear_history()
  261 + #self.current_mask.clear_history()
262 262  
263 263 # TODO: merge this code with apply_slice_buffer_to_mask
264 264 b_mask = self.buffer_slices["AXIAL"].mask
... ... @@ -276,6 +276,8 @@ class Slice(object):
276 276 self.current_mask.matrix[1:, 1:, n] = b_mask
277 277 self.current_mask.matrix[0, 0, n] = 1
278 278  
  279 + self.current_mask.save_threshold_history(threshold_range)
  280 +
279 281 def __set_current_mask_threshold_actual_slice(self, evt_pubsub):
280 282 threshold_range = evt_pubsub.data
281 283 index = self.current_mask.index
... ... @@ -908,7 +910,7 @@ class Slice(object):
908 910 # TODO: Voltar a usar marcacao na mascara
909 911 if orientation == 'AXIAL':
910 912 #if self.current_mask.matrix[index+1, 0, 0] != 2:
911   - #self.current_mask.save_history(index, orientation,
  913 + #self.current_mask.save_edition_history(index, orientation,
912 914 #self.current_mask.matrix[index+1,1:,1:],
913 915 #clean=True)
914 916 p_mask = self.current_mask.matrix[index+1,1:,1:].copy()
... ... @@ -917,7 +919,7 @@ class Slice(object):
917 919  
918 920 elif orientation == 'CORONAL':
919 921 #if self.current_mask.matrix[0, index+1, 0] != 2:
920   - #self.current_mask.save_history(index, orientation,
  922 + #self.current_mask.save_edition_history(index, orientation,
921 923 #self.current_mask.matrix[1:, index+1, 1:],
922 924 #clean=True)
923 925 p_mask = self.current_mask.matrix[1:, index+1, 1:].copy()
... ... @@ -926,14 +928,14 @@ class Slice(object):
926 928  
927 929 elif orientation == 'SAGITAL':
928 930 #if self.current_mask.matrix[0, 0, index+1] != 2:
929   - #self.current_mask.save_history(index, orientation,
  931 + #self.current_mask.save_edition_history(index, orientation,
930 932 #self.current_mask.matrix[1:, 1:, index+1],
931 933 #clean=True)
932 934 p_mask = self.current_mask.matrix[1:, 1:, index+1].copy()
933 935 self.current_mask.matrix[1:, 1:, index+1] = b_mask
934 936 self.current_mask.matrix[0, 0, index+1] = 2
935 937  
936   - self.current_mask.save_history(index, orientation, b_mask, p_mask)
  938 + self.current_mask.save_edition_history(index, orientation, b_mask, p_mask)
937 939 self.current_mask.was_edited = True
938 940  
939 941 for o in self.buffer_slices:
... ...