# Lay the cut-size stickers out at 1:1 on an A4 page with dimension lines and a 2 in ruler, to print and check with a real ruler.
# usage: python size-reference.py
import io, re, sys
import numpy as np, cairosvg
from PIL import Image
SRC, OUT = sys.argv[1:3]
NAMES = ["witch-hex-cellent", "bat-going-batty", "vampire-fang-cy", "ghost-boo-always-online", "ghost-no-ghost-customers"]
DPI, PAGE_W, PAGE_H = 300, 2480, 3508
INK, DIM, CUT = "#0C2B27", "#C42B60", "#EC008C"
def cut_box(svg, px):
"""Bounding box of the cut line, in the sticker page's own pixels."""
i, j = svg.index(' 128
ys, xs = np.nonzero(a)
return xs.min() / 2, ys.min() / 2, (xs.max() + 1) / 2, (ys.max() + 1) / 2
def label(x, y, s, size=34, anchor="middle", rot=0):
t = f' transform="rotate({rot} {x} {y})"' if rot else ""
return f'{s} '
def dim_h(x0, x1, y):
tick = 18
return (f' '
+ label((x0 + x1) / 2, y - 16, f'{(x1 - x0) / DPI:.2f} in'))
def dim_v(y0, y1, x):
tick = 18
return (f' '
+ label(x - 16, (y0 + y1) / 2, f'{(y1 - y0) / DPI:.2f} in', rot=-90))
parts = []
cells = [(330, 330), (1290, 330), (330, 1430), (1290, 1430), (330, 2530)]
for name, (cx, cy) in zip(NAMES, cells):
svg = open(f"{SRC}/{name}.svg").read()
w_in = float(re.search(r'width="([\d.]+)in"', svg).group(1))
px = round(w_in * DPI)
bx0, by0, bx1, by1 = cut_box(svg, px)
inner = re.sub(r']*>', f'', svg, count=1)
inner = re.sub(r'.*? ', "", inner, flags=re.S).replace('stroke="#EC008C" stroke-width="1"', f'stroke="{CUT}" stroke-width="5"')
X0, Y0, X1, Y1 = cx + bx0, cy + by0, cx + bx1, cy + by1
parts += [f' ',
inner, dim_h(X0, X1, Y0 - 50), dim_v(Y0, Y1, X0 - 50),
label(cx + px / 2, cy + px + 70, name, size=30, anchor="middle").replace(DIM, INK)]
rx, ry = 1290, 2900
ticks = "".join(f' ' for i in range(17))
parts.append(f' ' + ticks
+ label(rx, ry + 70, "0", 34, "middle").replace(DIM, INK) + label(rx + DPI, ry + 70, "1 in", 34).replace(DIM, INK)
+ label(rx + 2 * DPI, ry + 70, "2 in", 34).replace(DIM, INK)
+ label(rx + DPI, ry + 150, "2-inch ruler — print at 100% / actual size", 30).replace(DIM, INK))
parts.append(label(PAGE_W / 2, 150, "MyBazaar Halloween stickers — 2 in size check (1:1 on A4)", 46).replace(DIM, INK))
parts.append(label(PAGE_W / 2, 210, "pink = measured size at the cut line · magenta outline = cut · dashed box = outer edge of the cut", 30).replace(DIM, INK))
page = (f''
f' ' + "".join(parts) + " ")
open(f"{OUT}.svg", "w").write(page)
cairosvg.svg2pdf(bytestring=page.encode(), write_to=f"{OUT}.pdf")
cairosvg.svg2png(bytestring=page.encode(), write_to=f"{OUT}.png", output_width=PAGE_W, output_height=PAGE_H, background_color="#FFFFFF")