Advertisement
EditorRUS

Discrete field module

Mar 14th, 2016
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.56 KB | None | 0 0
  1. """
  2. Dimension maps
  3. CREATE MAP
  4.  Size, dimensions, standard symbol
  5.  Defines a discrete field
  6. PURGE MAP
  7.  Resets the discrete field to the default
  8. SET
  9.  List of coords, value
  10.  Sets value on the coords
  11. GET
  12.  List of coords
  13.  Returns value from the field
  14. MAP_FUNC
  15.  Function (COORDS, VALUE)
  16.  Calls the function on every coord
  17. BOUND
  18.  List of coords
  19.  Returns whether coords lie inside the field
  20. MAP_OBJECT
  21.  Returns the map itself as a list
  22. SHOW_FUNC
  23.  List of functions for each level called AFTER, list of functions for each level called BEFORE incrementing
  24.  First function is called when X is changed
  25.  Second function is called when Y is changed
  26.  Third function is called when Z is changed
  27.  ...
  28. """
  29.  
  30. from copy import deepcopy
  31. class Map:
  32.     the_map = []
  33.     default = 0
  34.     cur_size = 0
  35.     dimension = 0
  36.     def __init__(self, size, dimensions=2, standard=0):
  37.         self.create_map(size, dimensions, standard)
  38.  
  39.     def __round__(self, n):
  40.         # Performs roundation on the whole map if possible
  41.         def roundation(part, coord, value):
  42.             if hasattr(value, "__round__"):
  43.                 part.set(coord, round(value, n))
  44.         self.map_func(roundation)
  45.  
  46.     def create_map(self, size, dimensions=2, standard=0.0):
  47.         blank = []
  48.         temporary = []
  49.         for x in range(size):
  50.             blank.append(deepcopy(standard))
  51.         for dimension in range(0, dimensions-1):
  52.             for x in range(size):
  53.                 temporary.append(deepcopy(blank))
  54.             blank = temporary
  55.             temporary = []
  56.         self.the_map = blank
  57.         self.default = standard
  58.         self.cur_size = size
  59.         self.dimension = dimensions
  60.  
  61.     def purge_map(self):
  62.         def reset(level):
  63.             if type(level) is list:
  64.                 for i in range(len(level)):
  65.                     if type(level[i]) is list:
  66.                         reset(level[i])
  67.                     else:
  68.                         level[i] = default
  69.             else:
  70.                 level = default
  71.         reset(self.the_map)
  72.  
  73.     def bound(self, coords):
  74.         for coord in coords:
  75.             if coord < 0:
  76.                 return False
  77.             if coord >= self.cur_size:
  78.                 return False
  79.         return True
  80.  
  81.     def set(self, coords, value):
  82.         if not self.bound(coords): return False
  83.         cur_lev = self.the_map
  84.         for i in range(min(self.dimension-1, len(coords)-1)):
  85.             cur_lev = cur_lev[coords[i]]
  86.         cur_lev[coords[len(coords)-1]] = value
  87.         return True
  88.  
  89.     def get(self, coords):
  90.         if not self.bound(coords): return False
  91.         cur_lev = self.the_map
  92.         for i in range(min(self.dimension-1, len(coords)-1)):
  93.             cur_lev = cur_lev[coords[i]]
  94.         return cur_lev[coords[len(coords)-1]]
  95.  
  96.     def map_func(self, gf):
  97.         coord_set = []      
  98.         for i in range(self.dimension):
  99.             coord_set.append(0)
  100.         while coord_set[0] < self.cur_size:
  101.             n = self.dimension-1
  102.             gf(self, coord_set, self.get(coord_set))
  103.             while n > 0:
  104.                 if coord_set[n]+1 < self.cur_size:
  105.                     coord_set[n] += 1
  106.                     break
  107.                 else:
  108.                     coord_set[n] = 0
  109.                     coord_set[n-1] += 1
  110.                     n -= 1
  111.                     continue
  112.  
  113.     def show_func(self, funka=[], funkb=[]):
  114.         coord_set = []
  115.         lst = self.dimension-1
  116.         lim = self.cur_size
  117.         for m in range(self.dimension):
  118.             coord_set.append(0)
  119.         def anti_coord():
  120.             x = deepcopy(coord_set)
  121.             x.reverse()
  122.             return x
  123.         def funkby(n):
  124.             if n < len(funkb):
  125.                 f = funkb[n]
  126.                 if callable(f):
  127.                     f(self, anti_coord(), self.get(anti_coord()))
  128.         def funkay(n):
  129.             if n < len(funka):
  130.                 f = funka[n]
  131.                 if callable(f):
  132.                     f(self, anti_coord(), self.get(anti_coord()))
  133.         def incen(n):
  134.             if n > lst:
  135.                 return True
  136.             if coord_set[n] >= lim:
  137.                 coord_set[n] = 0
  138.                 if n == 0:
  139.                     funkay(0)
  140.                 return True
  141.             if coord_set[n] < lim:
  142.                 funkby(n)
  143.                 if incen(n+1):
  144.                     funkay(n)
  145.                     coord_set[n] += 1
  146.                     incen(n)
  147.             return True
  148.         incen(0)
  149.        
  150.     def map_object():
  151.         return the_map
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement