From 3da613af947deafe13dd738f23d92235b980f869 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Wed, 18 Jan 2023 15:04:04 +0100 Subject: [PATCH] [WIP] recursive random table: Add recursive construction --- test/fixtures/page_generation/page.py | 37 ++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/test/fixtures/page_generation/page.py b/test/fixtures/page_generation/page.py index a18fbc7..95f32d7 100644 --- a/test/fixtures/page_generation/page.py +++ b/test/fixtures/page_generation/page.py @@ -427,6 +427,7 @@ def every_nth(n, iterable): def generate_random_plot(rectangle: Rectangle) -> ContentRectangle: block = RandomPlot(*rectangle.coords) + block.content = rectangle.content if isinstance(rectangle, ContentRectangle) else None # TODO: Refactor block.generate_random_plot(rectangle) return block @@ -459,7 +460,7 @@ class RecursiveRandomTable(RandomContentRectangle): def __init__(self, x1, y1, x2, y2, seed=None): super().__init__(x1, y1, x2, y2, seed=seed) self.n_columns = max(self.width // 100, 1) - self.n_rows = max(self.height // 17, 1) + self.n_rows = max(self.height // random.randint(17, 100), 1) self.cell_size = (self.width // self.n_columns, self.height // self.n_rows) self.content = Image.new("RGBA", (self.width, self.height), (255, 255, 255, 255)) @@ -476,8 +477,20 @@ class RecursiveRandomTable(RandomContentRectangle): for cell in self.generate_table(): self.draw_single_cell_borders(cell) inner_region = shrink_rectangle(cell, 0.1) - cell.content = generate_random_text_block(inner_region, n_sentences=1).content + + choice = random.choice(["text", "plot", "recurse", "plain_table"]) + + if choice == "text": + cell.content = generate_random_text_block(inner_region, n_sentences=1).content + elif choice == "plot": + cell.content = generate_random_plot(inner_region).content + elif choice == "recurse": + cell.content = generate_recursive_random_table(inner_region).content + elif choice == "plain_table": + cell.content = generate_random_table(inner_region).content + assert cell.content.mode == "RGBA" + yield cell def draw_cell_borders(self, cells: List[ContentRectangle]): @@ -708,8 +721,7 @@ class RandomPlot(RandomContentRectangle): def generate_random_bar_plot(self, rectangle: Rectangle): x = sorted(np.random.randint(low=1, high=11, size=5)) y = np.random.randint(low=1, high=11, size=5) - image = self.__generate_random_plot(plt.bar, rectangle, x, y) - self.content = image + self.__generate_random_plot(plt.bar, rectangle, x, y) def generate_random_line_plot(self, rectangle: Rectangle): f = random.choice([np.sin, np.cos, np.tan, np.exp, np.log, np.sqrt, np.square]) @@ -717,26 +729,20 @@ class RandomPlot(RandomContentRectangle): x = np.linspace(0, 10, 100) y = f(x) - image = self.__generate_random_plot(plt.plot, rectangle, x, y) - self.content = image + self.__generate_random_plot(plt.plot, rectangle, x, y) def generate_random_scatter_plot(self, rectangle: Rectangle): x = np.random.normal(size=100) y = np.random.normal(size=100) - image = self.__generate_random_plot(plt.scatter, rectangle, x, y) - self.content = image + self.__generate_random_plot(plt.scatter, rectangle, x, y) def generate_random_histogram(self, rectangle: Rectangle): x = np.random.normal(size=100) - image = self.__generate_random_plot(plt.hist, rectangle, x, 10) - self.content = image + self.__generate_random_plot(plt.hist, rectangle, x, 10) def generate_random_pie_chart(self, rectangle: Rectangle): x = np.random.uniform(size=10) - image = self.__generate_random_plot( - plt.pie, rectangle, x, None, plot_kwargs=self.generate_plot_kwargs(keywords=["a"]) - ) - self.content = image + self.__generate_random_plot(plt.pie, rectangle, x, None, plot_kwargs=self.generate_plot_kwargs(keywords=["a"])) def generate_plot_kwargs(self, keywords=None): @@ -779,7 +785,8 @@ class RandomPlot(RandomContentRectangle): maybe() and (ax.spines["top"].set_visible(False) or ax.spines["right"].set_visible(False)) image = dump_plt_to_image(rectangle) - return image + + self.content = image if not self.content else superimpose_texture_with_transparency(self.content, image) def maybe():