Grid.range[XYZ]: ability to pad the range

Grid.toggleGrid(): toggle everything!
Grid.getSum(): give correct sum even if the default is not 0
This commit is contained in:
Stefan Harmuth 2021-12-20 08:30:19 +01:00
parent d8d7112098
commit 3b0a6480a3

View File

@ -51,14 +51,16 @@ class Grid:
self.minZ = min(pos.z, self.minZ) self.minZ = min(pos.z, self.minZ)
self.maxZ = max(pos.z, self.maxZ) self.maxZ = max(pos.z, self.maxZ)
def rangeX(self): def rangeX(self, pad: int = 0):
return range(self.minX, self.maxX + 1) return range(self.minX - pad, self.maxX + pad + 1)
def rangeY(self): def rangeY(self, pad: int = 0):
return range(self.minY, self.maxY + 1) return range(self.minY - pad, self.maxY + pad + 1)
def rangeZ(self): def rangeZ(self, pad: int = 0):
return range(self.minZ, self.maxZ + 1) 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): def toggle(self, pos: Coordinate):
if pos in self.__grid: if pos in self.__grid:
@ -67,6 +69,15 @@ class Grid:
self.__trackBoundaries(pos) self.__trackBoundaries(pos)
self.__grid[pos] = not self.__default 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: def set(self, pos: Coordinate, value: Any = True) -> Any:
if pos.z is not None: if pos.z is not None:
self.mode3D = True self.mode3D = True
@ -139,12 +150,21 @@ class Grid:
return list(self.__grid.keys()) return list(self.__grid.keys())
def getSum(self, includeNegative: bool = True) -> Numeric: def getSum(self, includeNegative: bool = True) -> Numeric:
grid_sum = 0 if not self.mode3D:
for value in self.__grid.values(): return sum(
if includeNegative or value > 0: self.get(Coordinate(x, y))
grid_sum += value for x in self.rangeX()
for y in self.rangeY()
return grid_sum 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) \ def getNeighboursOf(self, pos: Coordinate, includeDefault: bool = False, includeDiagonal: bool = True) \
-> List[Coordinate]: -> List[Coordinate]:
@ -259,11 +279,11 @@ class Grid:
return pathCoords 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 y in range(self.minY, self.maxY + 1):
for x in range(self.minX, self.maxX + 1): for x in range(self.minX, self.maxX + 1):
if true_char: 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: else:
print(self.get(Coordinate(x, y)), end="") print(self.get(Coordinate(x, y)), end="")
print(spacer, end="") print(spacer, end="")