diff --git a/tools/grid.py b/tools/grid.py index 22f2210..21b28a7 100644 --- a/tools/grid.py +++ b/tools/grid.py @@ -51,14 +51,16 @@ class Grid: self.minZ = min(pos.z, self.minZ) self.maxZ = max(pos.z, self.maxZ) - def rangeX(self): - return range(self.minX, self.maxX + 1) + def rangeX(self, pad: int = 0): + return range(self.minX - pad, self.maxX + pad + 1) - def rangeY(self): - return range(self.minY, self.maxY + 1) + def rangeY(self, pad: int = 0): + return range(self.minY - pad, self.maxY + pad + 1) - def rangeZ(self): - return range(self.minZ, self.maxZ + 1) + def rangeZ(self, pad: int = 0): + if not self.mode3D: + raise ValueError("rangeZ not available in 2D space") + return range(self.minZ - pad, self.maxZ + pad + 1) def toggle(self, pos: Coordinate): if pos in self.__grid: @@ -67,6 +69,15 @@ class Grid: self.__trackBoundaries(pos) self.__grid[pos] = not self.__default + def toggleGrid(self): + for x in self.rangeX(): + for y in self.rangeY(): + if not self.mode3D: + self.toggle(Coordinate(x, y)) + else: + for z in self.rangeZ(): + self.toggle(Coordinate(x, y, z)) + def set(self, pos: Coordinate, value: Any = True) -> Any: if pos.z is not None: self.mode3D = True @@ -139,12 +150,21 @@ class Grid: return list(self.__grid.keys()) def getSum(self, includeNegative: bool = True) -> Numeric: - grid_sum = 0 - for value in self.__grid.values(): - if includeNegative or value > 0: - grid_sum += value - - return grid_sum + if not self.mode3D: + return sum( + self.get(Coordinate(x, y)) + for x in self.rangeX() + for y in self.rangeY() + if includeNegative or self.get(Coordinate(x, y)) >= 0 + ) + else: + return sum( + self.get(Coordinate(x, y, z)) + for x in self.rangeX() + for y in self.rangeY() + for z in self.rangeZ() + if includeNegative or self.get(Coordinate(x, y)) >= 0 + ) def getNeighboursOf(self, pos: Coordinate, includeDefault: bool = False, includeDiagonal: bool = True) \ -> List[Coordinate]: @@ -259,11 +279,11 @@ class Grid: return pathCoords - def print(self, spacer: str = "", true_char: str = None): + def print(self, spacer: str = "", true_char: str = None, false_char: str = " "): for y in range(self.minY, self.maxY + 1): for x in range(self.minX, self.maxX + 1): if true_char: - print(true_char if self.get(Coordinate(x, y)) else " ", end="") + print(true_char if self.get(Coordinate(x, y)) else false_char, end="") else: print(self.get(Coordinate(x, y)), end="") print(spacer, end="")