diff --git a/House.py b/House.py new file mode 100644 index 0000000..68f4bb7 --- /dev/null +++ b/House.py @@ -0,0 +1,925 @@ + +from time import sleep +from gdpc import Editor, Block, geometry +import numpy as np +import math +import matplotlib.pyplot as plt + +class House: + def __init__(self, editor, coordinates_min, coordinates_max, direction, list_block): + self.editor = editor + self.coordinates_min = coordinates_min + self.coordinates_max = coordinates_max + self.skeleton = [] + + size = [(coordinates_max[i] - coordinates_min[i]) + 10 for i in range(3)] + + self.grid3d = np.zeros(size, dtype=[('bool', bool), ('int', int)]) + + self.nbEtage = (coordinates_max[1] - coordinates_min[1]) // 5 + + self.direction = direction + + self.entranceWall = None + + self.blocks = list_block + + self.entranceCo = None + + + self.wall = Block(list_block["wall"]) + self.roof = Block(list_block["roof"]) + self.roof_slab = Block(list_block["roof_slab"]) + self.door = Block(list_block["door"]) + self.window = Block(list_block["window"]) + self.entrance = Block(list_block["entrance"]) + self.stairs = Block(list_block["stairs"]) + self.celling = Block(list_block["celling"]) + self.floor = Block(list_block["floor"]) + self.celling_slab = Block(list_block["celling_slab"]) + self.gardenOutline = Block(list_block["garden_outline"]) + self.garden_floor = Block(list_block["garden_floor"]) + + + + def createHouseSkeleton(self): + self.delete() + x_min, y_min, z_min = self.coordinates_min + x_max, y_max, z_max = self.coordinates_max + + perimeter_width = x_max - x_min + perimeter_depth = z_max - z_min + + x_min += 1 + z_min += 1 + x_max -= 1 + z_max -= 1 + x = np.random.randint(x_min+1 , x_max-1) + z = np.random.randint(z_min+1 , z_max-1 ) + + width = perimeter_width // 2 + depth = perimeter_depth // 2 + height = y_max - y_min + + if x + width-1 > x_max-1: + x = x_max - width-1 + if z + depth-1 > z_max-1: + z = z_max - depth-1 + + x_plan3d = x - x_min + z_plan3d = z - z_min + + for i in range(0, width-1): + for j in range(0, depth-1): + self.editor.placeBlock((x + i, y_min, z + j), self.floor) + self.grid3d[x_plan3d+i,0,z_plan3d+j] = True,1 + self.skeleton.append((x, z, width-1, depth-1, height)) + print("Coordinates of the corners: ", (x, z), (x, z+depth-1), (x+width-1, z), (x+width-1, z+depth-1)) + + + + + x_min -= 1 + x_max -= 1 + z_min += 1 + z_max += 1 + + for _ in range(3): + print("Rectangle n°", _+1, "en cours de création") + + + for a in range(100000): + new_width = np.random.randint(5, width-2) + new_depth = np.random.randint(5, depth-2) + + new_x = np.random.randint(max(x_min+1, x - new_width ), min(x_max-new_width - 1, x + width )) + new_z = np.random.randint(max(z_min+1, z - new_depth), min(z_max-new_depth - 1, z + depth )) + + new_x_plan3d = new_x - x_min -1 + new_z_plan3d = new_z - z_min +1 + + adjacent_blocks = 0 + for i in range(new_x_plan3d, new_x_plan3d + new_width): + for j in range(new_z_plan3d, new_z_plan3d + new_depth): + if self.grid3d[i-1,0,j]['bool'] and self.grid3d[i-1,0,j]['int']==1 or self.grid3d[i+1,0,j]['bool'] and self.grid3d[i+1,0,j]['int']==1 or self.grid3d[i,0,j-1]['bool'] and self.grid3d[i,0,j-1]['int']==1 or self.grid3d[i,0,j+1]['bool'] and self.grid3d[i,0,j+1]['int']==1: + adjacent_blocks += 1 + + if adjacent_blocks < 3: + continue + + if not np.any(self.grid3d[new_x_plan3d:new_x_plan3d+new_width,0, new_z_plan3d:new_z_plan3d+new_depth]['bool']): + new_x_plan3d = new_x - x_min + new_z_plan3d = new_z - z_min + for i in range(0, new_width): + for j in range(0, new_depth): + self.grid3d[new_x_plan3d + i,0, new_z_plan3d + j] = True,2 + + if i == 0 or i == new_width-1 or j == 0 or j == new_depth-1: + continue + else: + self.editor.placeBlock((new_x + i, y_min, new_z + j), self.floor) + + self.skeleton.append((new_x, new_z, new_width, new_depth, height)) + break + else: + print("Failed to place rectangle after 1000 attempts.") + + + def delete(self): + for x in range(self.coordinates_min[0], self.coordinates_max[0]): + for y in range(self.coordinates_min[1], self.coordinates_max[1]+10): + for z in range(self.coordinates_min[2], self.coordinates_max[2]): + self.editor.placeBlock((x, y, z), Block("air")) + + def putWallOnSkeleton(self): + for k in range(len(self.skeleton)): + x, z, width, depth, height = self.skeleton[k] + + + if k!= 0: + x+=1 + z+=1 + width-=2 + depth-=2 + x_plan3d = x - self.coordinates_min[0] + z_plan3d = z - self.coordinates_min[2] + for i in range(-1, width+1): + for j in range(-1, depth+1): + for y in range(0, height): + if i == -1 or i == width or j == -1 or j == depth: + if not (self.grid3d[x_plan3d + i,y, z_plan3d + j]['bool']) and not (self.grid3d[x_plan3d + i,y, z_plan3d + j]['int'] == 1) or (self.grid3d[x_plan3d + i,y, z_plan3d + j]['bool'] and self.grid3d[x_plan3d + i,y, z_plan3d + j]['int'] == 2) or y==0: + self.editor.placeBlock((x + i, self.coordinates_min[1] + y, z + j), self.wall) + self.grid3d[ x_plan3d+i, y, z_plan3d+j] = True + + + def getAdjacentWalls(self): + + main_rect = self.skeleton[0] + x_main, z_main, width_main, depth_main, heigt_main = main_rect + adjacent_walls = [] + width_main-=1 + depth_main-=1 + + for k in range(1, len(self.skeleton)): + x, z, width, depth, heigt = self.skeleton[k] + + + walls = [(x, z, x + width-1, z), (x, z, x, z + depth-1), (x, z + depth-1, x + width-1, z + depth-1), (x + width-1, z, x + width-1, z + depth-1)] + for wall in walls: + x1, z1, x2, z2 = wall + if (x_main <= x1 <= x_main + width_main or x_main <= x2 <= x_main + width_main) and (z_main - 1 == z1 or z_main + depth_main + 1 == z1): + x1 = max(x1, x_main-1) + x2 = min(x2, x_main + width_main+1) + if abs(x2 - x1) > 1: + adjacent_walls.append((x1, z1, x2, z2)) + elif (z_main <= z1 <= z_main + depth_main or z_main <= z2 <= z_main + depth_main) and (x_main - 1 == x1 or x_main + width_main + 1 == x1): + z1 = max(z1, z_main-1) + z2 = min(z2, z_main + depth_main+1) + if abs(z2 - z1) > 1: + adjacent_walls.append((x1, z1, x2, z2)) + + return adjacent_walls + + + + + def placeDoor(self): + walls = self.getAdjacentWalls() + for wall in walls: + for i in range(self.nbEtage): + x_min, z_min, x_max, z_max = wall + if x_min == x_max: + width = z_max - z_min + if width % 2 != 0: + door_pos = width // 2 + for y in range(self.coordinates_min[1]+1+i*4, self.coordinates_min[1]+3+i*4): + self.editor.placeBlock((x_min, y, z_min + door_pos), Block("air")) + self.editor.placeBlock((x_min, y, z_min + door_pos+1), Block("air")) + else: + door_pos = width // 2 + for y in range(self.coordinates_min[1]+1+i*4 , self.coordinates_min[1]+3+i*4): + self.editor.placeBlock((x_min, y, z_min + door_pos), Block("air")) + else: + width = x_max - x_min + if width % 2 != 0: + door_pos = width // 2 + for y in range(self.coordinates_min[1]+1+i*4, self.coordinates_min[1]+3+i*4): + self.editor.placeBlock((x_min + door_pos, y, z_min), Block("air")) + self.editor.placeBlock((x_min + door_pos+1, y, z_min), Block("air")) + + else: + door_pos = width // 2 + for y in range(self.coordinates_min[1]+1+i*4, self.coordinates_min[1]+3+i*4): + self.editor.placeBlock((x_min + door_pos, y, z_min), Block("air")) + + def placeRoof(self): + for k in range(len(self.skeleton)-1, -1, -1): + x, z, width, depth, height = self.skeleton[k] + + + + if k!= 0: + x+=1 + z+=1 + width-=2 + depth-=2 + if width < depth: + if width <=5: + n = 1 + elif width <=10: + n = 2 + else: + n = 3 + else: + if depth <=5: + n = 1 + elif depth <=10: + n = 2 + else: + n = 3 + else: + + if width < depth: + n = width // 4 + else: + n = depth // 4 + + + x_plan3d = x - self.coordinates_min[0] + z_plan3d = z - self.coordinates_min[2] + + print(width, depth, n) + + if width < depth: + + + if n>1: + for k in range(n-1): + for i in range(-1, depth+1): + for y in range(-1, width//2+1): + self.editor.placeBlock((x + i, self.coordinates_max[1]+k, z+y+k+3), self.roof) + self.editor.placeBlock((x + i, self.coordinates_max[1]+k, z+depth-y-4-k), self.roof) + if width%2 == 0: + for i in range(-1, depth+1): + self.editor.placeBlock((x+width//2+1, self.coordinates_max[1]+n-1, z+i), self.roof) + for i in range(-1,depth+1): + self.editor.placeBlock((x+width//2, self.coordinates_max[1]+n-1, z+i), self.roof) + + else: + if n>1: + for k in range(n-1): + for i in range(-1, width+1): + for y in range(-1, depth//2+1): + self.editor.placeBlock((x + i, self.coordinates_max[1]+k, z+y+k+2), self.roof) + self.editor.placeBlock((x + i, self.coordinates_max[1]+k, z+depth-y-3-k), self.roof) + if depth%2 == 0: + for i in range(-1, width+1): + self.editor.placeBlock((x+i, self.coordinates_max[1]+n-1, z+depth//2+1), self.roof) + for i in range(-1,width+1): + self.editor.placeBlock((x+i, self.coordinates_max[1]+n-1, z+depth//2), self.roof) + + print('-----------------------------------') + + for i in range(-1, width+1): + for j in range(-1, depth+1): + if width 1: + house.placeStairs() + + +if __name__ == "__main__": + editor = Editor(buffering=True) + buildArea = editor.getBuildArea() + coordinates_min = [min(buildArea.begin[i], buildArea.last[i]) for i in range(3)] + coordinates_max = [max(buildArea.begin[i], buildArea.last[i]) for i in range(3)] + + blocks = { + "wall": "blackstone", + "roof": "blackstone", + "roof_slab": "blackstone_slab", + "door": "oak_door", + "window": "glass_pane", + "entrance": "oak_door", + "stairs": "quartz_stairs", + "stairs_slab": "quartz_slab", + "celling": "quartz_block", + "floor": "quartz_block", + "celling_slab": "quartz_slab", + "garden_outline": "oak_leaves", + "garden_floor": "grass_block" + } + + for i in range(1): + house = House(editor, coordinates_min, coordinates_max,"W", blocks) + + house.build() + + new_coordinates_min =(coordinates_max[0] + 10, coordinates_min[1], coordinates_min[2]) + new_coordinates_max = (coordinates_max[0] + 10 +24, coordinates_max[1], coordinates_max[2]) + coordinates_min = new_coordinates_min + coordinates_max = new_coordinates_max + + # delete(editor, coordinates_min, coordinates_max) + editor.flushBuffer() + + + + \ No newline at end of file diff --git a/main.py b/main.py index 059a03a..56e4e09 100644 --- a/main.py +++ b/main.py @@ -35,18 +35,11 @@ building.build(editor, ["stone_bricks","glass_pane","glass","cobblestone_wall"," # # Get a block -# block = editor.getBlock((0,48,0)) - -# # Place a block -# editor.placeBlock((0 , 5, 0), Block("stone")) +block = editor.getBlock((0,48,0)) # # Build a cube # geometry.placeCuboid(editor, (458, 92, 488), (468, 99, 471), Block("oak_planks")) # curve = curve.Curve([(396, 132, 740), (435, 138, 730), # (443, 161, 758), (417, 73, 729)]) -# curve.compute_curve() - -# for point in curve.computed_points: -# print(point) -# editor.placeBlock(point, Block("stone")) +# curve.compute_curve() \ No newline at end of file