Exemple #1
0
 def cell_array_generator(self, key):
     """Generator traversing cells specified in key
     
     Parameters
     ----------
     key: Iterable of Integer or slice
     \tThe key specifies the cell keys of the generator
     
     """
     
     for i, key_ele in enumerate(key):
         
         # Get first element of key that is a slice
         
         if type(key_ele) is SliceType:
             slc_keys = slice_range(key_ele, self.dict_grid.shape[i])
             
             key_list = list(key)
             
             key_list[i] = None
             
             has_subslice = any(type(ele) is SliceType for ele in key_list)
                                         
             for slc_key in slc_keys:
                 key_list[i] = slc_key
                 
                 if has_subslice:
                     # If there is a slice left yield generator
                     yield self.cell_array_generator(key_list)
                     
                 else:
                     # No slices? Yield value
                     yield self[tuple(key_list)]
                 
             break
Exemple #2
0
 def __setitem__(self, key, value):
     """Accepts index and slice keys"""
     
     single_keys_per_dim = []
     
     for axis, key_ele in enumerate(key):
         if is_slice_like(key_ele):
             # We have something slice-like here 
             
             single_keys_per_dim.append(slice_range(key_ele, 
                                                    length = key[axis]))
             
         elif is_string_like(key_ele):
             # We have something string-like here 
             
             raise NotImplementedError
         
         else:
             # key_ele is a single cell
             
             single_keys_per_dim.append((key_ele, ))
     
     single_keys = product(*single_keys_per_dim)
     
     unredo_mark = False
     
     for single_key in single_keys:
         if value:
             # UnRedo support
             
             old_value = self(key)
             
             # We seem to have double calls on __setitem__
             # This hack catches them
             
             if old_value != value:
             
                 unredo_mark = True
             
                 undo_operation = (self.__setitem__, [key, old_value])
                 redo_operation = (self.__setitem__, [key, value])
     
                 self.unredo.append(undo_operation, redo_operation)
                 
                 # End UnRedo support
             
             self.dict_grid[single_key] = value
         else:
             # Value is empty --> delete cell
             try:
                 self.dict_grid.pop(key)
                 
             except (KeyError, TypeError):
                 pass
                 
     if unredo_mark:
         self.unredo.mark()