[WIP] More table / cell edge fiddling and issue fixing

Fix: The cell width and height were rounded to int in the table
constructor. The imprecison of rounding would accumulate when stacking
cells in a row or columns leading to gaps at the bottom and right hand
edge of tables.
The rounding has now been removed and left to the cell constructor.
Cells are derived from the Rectangle class, which does the rounding
itself. This eliminates the issue with accumulated gaps in the tables.
This commit is contained in:
Matthias Bisping 2023-01-25 18:16:33 +01:00
parent 826cd3b6a9
commit 5dc13e7137

View File

@ -32,7 +32,8 @@ from cv_analysis.utils.postprocessing import remove_overlapping, remove_included
from cv_analysis.utils.spacial import area
random_seed = random.randint(0, 2**32 - 1)
random_seed = 3896311122
# random_seed = 3896311122
random_seed = 1986343479
rnd = random.Random(random_seed)
logger.info(f"Random seed: {random_seed}")
@ -165,10 +166,10 @@ Color = Tuple[int, int, int]
@pytest.fixture(
params=[
"rough_grain",
# "rough_grain",
# "plain",
# "digital",
# "crumpled",
"crumpled",
]
)
def base_texture(request, size):
@ -199,10 +200,10 @@ def dpi(request):
@pytest.fixture(
params=[
"brown",
# "brown",
# "sepia",
# "gray",
# "white",
"white",
# "light_red",
# "light_blue",
]
@ -224,9 +225,9 @@ def texture_name(request):
@pytest.fixture(
params=[
30,
# 30,
# 70,
# 150,
150,
]
)
def color_intensity(request):
@ -351,6 +352,7 @@ def superimpose_texture_with_transparency(page: Image, texture: Image, autocrop=
assert page.size == texture.size
assert texture.mode == "RGBA"
page.paste(texture, (0, 0), texture)
return page
@ -544,7 +546,16 @@ class RecursiveRandomTable(RandomContentRectangle):
super().__init__(x1, y1, x2, y2, seed=seed)
self.n_columns = rnd.randint(1, max(self.width // 100, 1))
self.n_rows = rnd.randint(1, max(self.height // rnd.randint(17, 100), 1))
self.cell_size = (self.width // self.n_columns, self.height // self.n_rows)
cell_width, cell_height = (self.width / self.n_columns, self.height / self.n_rows)
width_delta = (self.width - cell_width * self.n_columns) / self.n_columns
height_delta = (self.height - cell_height * self.n_rows) / self.n_rows
logger.debug(f"width_delta: {width_delta}, height_delta: {height_delta}")
self.cell_size = cell_width, cell_height
logger.debug(f"cell size: {self.cell_size}")
self.content = Image.new("RGBA", (self.width, self.height), (255, 255, 255, 0))
self.background_color = tuple([rnd.randint(100, 200) for _ in range(3)] + [rnd.randint(180, 210)])
@ -562,7 +573,7 @@ class RecursiveRandomTable(RandomContentRectangle):
# elif self.n_rows == 1:
# self.layout = rnd.choice(["horizontal", "closed"])
self.layout = "open" # TODO: Remove this line
self.layout = "closed" # TODO: Remove this line
self.layout = layout or self.layout
@ -585,10 +596,10 @@ class RecursiveRandomTable(RandomContentRectangle):
def inner(cell):
inner_region = shrink_rectangle(cell, 0.11)
# inner_region = shrink_rectangle(cell, 0.11)
choice = rnd.choice(["text", "plot", "recurse", "plain_table", "blank"])
size = get_size(inner_region)
size = get_size(cell)
if size <= Size.SMALL.value:
words = generate_random_words(1, 3)
@ -641,6 +652,8 @@ class RecursiveRandomTable(RandomContentRectangle):
if row_index < self.n_rows - 1:
cell.draw_bottom_border()
# cell.draw()
columns = chunks(self.n_rows, cells)
for col_idx, columns in enumerate(columns):
for row_index, cell in enumerate(columns):
@ -777,7 +790,7 @@ class Cell(ContentRectangle):
def fill(self, color=None):
color = color or self.background_color
image = Image.new("RGBA", (self.width, self.height), color=color)
self.content = image if not self.content else superimpose_texture_with_transparency(image, self.content)
self.content = superimpose_texture_with_transparency(image, self.content)
return self