more robust and future-proof architecture
This commit is contained in:
121
scripts/compute_layout.py
Normal file
121
scripts/compute_layout.py
Normal file
@@ -0,0 +1,121 @@
|
||||
from typing import *
|
||||
|
||||
|
||||
# Card size info
|
||||
TOTAL_HEIGHT = 1125
|
||||
TOTAL_WIDTH = 825
|
||||
BLEED_MARGIN = 37.5
|
||||
SAFE_MARGIN = 75
|
||||
MAX_SAFE_X = TOTAL_WIDTH - SAFE_MARGIN
|
||||
MAX_SAFE_Y = TOTAL_HEIGHT - SAFE_MARGIN
|
||||
|
||||
# Icon info
|
||||
ICON_SIZE = 125
|
||||
ICON_MARGIN_LEFT = 0
|
||||
ICON_MARGIN_TOP = 0
|
||||
ICON_X = ICON_MARGIN_LEFT + SAFE_MARGIN
|
||||
ICON_Y = ICON_MARGIN_TOP + SAFE_MARGIN
|
||||
|
||||
# Banner info
|
||||
BANNER_WIDTH = 75
|
||||
BANNER_HEIGHT = 225
|
||||
BANNER_X = ICON_X + ICON_SIZE + 10
|
||||
BANNER_Y = 0
|
||||
BANNER_TEXT_FONT = "\"ethnocentric 12\""
|
||||
BANNER_TEXT_X = BANNER_X - 10
|
||||
BANNER_TEXT_Y = BANNER_HEIGHT // 3
|
||||
BANNER_TEXT_WIDTH = BANNER_WIDTH + 20
|
||||
|
||||
# Name info
|
||||
NAME_X = ICON_X + ICON_SIZE
|
||||
NAME_Y = SAFE_MARGIN + 10
|
||||
NAME_WIDTH = MAX_SAFE_X - NAME_X
|
||||
NAME_HEIGHT = 125
|
||||
NAME_FONT = "\"ethnocentric 11\""
|
||||
|
||||
NAME_WITH_BANNER_X = BANNER_X + BANNER_WIDTH
|
||||
NAME_WITH_BANNER_WIDTH = NAME_WIDTH - (NAME_WITH_BANNER_X - NAME_X)
|
||||
|
||||
def central_sym(x: int, y: int) -> Tuple[int, int]:
|
||||
return TOTAL_WIDTH - x, TOTAL_HEIGHT - y
|
||||
|
||||
# Alternative objects
|
||||
ALT_ICON_X, ALT_ICON_Y = central_sym(ICON_X, ICON_Y)
|
||||
ALT_BANNER_X, ALT_BANNER_Y = central_sym(BANNER_X, BANNER_Y)
|
||||
ALT_BANNER_TEXT_X, ALT_BANNER_TEXT_Y = central_sym(BANNER_TEXT_X, BANNER_TEXT_Y)
|
||||
|
||||
LAYOUT: str = f"""
|
||||
icon:
|
||||
x: {ICON_X}
|
||||
y: {ICON_Y}
|
||||
width: {ICON_SIZE}
|
||||
height: {ICON_SIZE}
|
||||
|
||||
alt_icon:
|
||||
extends: icon
|
||||
x: {ALT_ICON_X}
|
||||
y: {ALT_ICON_Y}
|
||||
angle: 3.14159
|
||||
|
||||
banner:
|
||||
x: {BANNER_X}
|
||||
y: {BANNER_Y}
|
||||
width: {BANNER_WIDTH}
|
||||
height: {BANNER_HEIGHT}
|
||||
|
||||
banner_text:
|
||||
x: {BANNER_TEXT_X}
|
||||
y: {BANNER_TEXT_Y}
|
||||
width: {BANNER_TEXT_WIDTH}
|
||||
height: 2c
|
||||
font: {BANNER_TEXT_FONT}
|
||||
align: center
|
||||
# hint: blue
|
||||
|
||||
alt_banner:
|
||||
extends: banner
|
||||
x: {ALT_BANNER_X}
|
||||
y: {ALT_BANNER_Y}
|
||||
angle: 3.14159
|
||||
|
||||
|
||||
alt_banner_text:
|
||||
extends: banner_text
|
||||
angle: 3.14159
|
||||
x: {ALT_BANNER_TEXT_X}
|
||||
y: {ALT_BANNER_TEXT_Y}
|
||||
|
||||
name:
|
||||
x: {NAME_X}
|
||||
y: {NAME_Y}
|
||||
width: {NAME_WIDTH}
|
||||
height: {NAME_HEIGHT}
|
||||
align: center
|
||||
valign: middle
|
||||
font: {NAME_FONT}
|
||||
# hint: red
|
||||
|
||||
name_with_banner:
|
||||
extends: name
|
||||
x: {NAME_WITH_BANNER_X}
|
||||
width: {NAME_WITH_BANNER_WIDTH}
|
||||
|
||||
cut:
|
||||
x: {BLEED_MARGIN}
|
||||
y: {BLEED_MARGIN}
|
||||
width: {TOTAL_WIDTH - (2 * BLEED_MARGIN)}
|
||||
height: {TOTAL_HEIGHT - (2 * BLEED_MARGIN)}
|
||||
stroke_color: gray
|
||||
stroke_width: 2
|
||||
|
||||
safe:
|
||||
x: {SAFE_MARGIN}
|
||||
y: {SAFE_MARGIN}
|
||||
width: {TOTAL_WIDTH - (2 * SAFE_MARGIN)}
|
||||
height: {TOTAL_HEIGHT - (2 * SAFE_MARGIN)}
|
||||
radius: 0.5c
|
||||
dash: 3mm 3mm
|
||||
"""
|
||||
|
||||
if __name__ == "__main__":
|
||||
open("layout.yml", "w").write(LAYOUT)
|
||||
60
scripts/extract_graphics.py
Normal file
60
scripts/extract_graphics.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from typing import *
|
||||
import os
|
||||
import subprocess
|
||||
import re
|
||||
import sys
|
||||
|
||||
|
||||
OUTPUT_DIR: str = "._graphics"
|
||||
ID_REGEX: re.Pattern = re.compile("rbk_.*")
|
||||
|
||||
|
||||
def get_all_ids(svg_file_name: str) -> List[str]:
|
||||
objects: bytes = subprocess.check_output([
|
||||
"inkscape",
|
||||
"--query-all",
|
||||
svg_file_name,
|
||||
])
|
||||
return [
|
||||
obj.split(b",")[0].decode("utf-8")
|
||||
for obj in
|
||||
objects.splitlines()
|
||||
]
|
||||
|
||||
|
||||
def id_filter(svg_id: str) -> bool:
|
||||
return ID_REGEX.match(svg_id) is not None
|
||||
|
||||
|
||||
def export_objects(svg_file: str, object_ids: Iterable[str]) -> None:
|
||||
|
||||
for obj in object_ids:
|
||||
command = [
|
||||
"inkscape",
|
||||
"--export-type=svg",
|
||||
"--export-plain-svg",
|
||||
"--vacuum-defs",
|
||||
"--export-id-only",
|
||||
"--export-id",
|
||||
obj,
|
||||
"-o",
|
||||
OUTPUT_DIR + "/" + obj[4:],
|
||||
svg_file,
|
||||
]
|
||||
print(f"exporting {obj[4:]}...", end="")
|
||||
res = subprocess.check_output(command)
|
||||
if res:
|
||||
print(f" An error might have occurred:\n{res}")
|
||||
else:
|
||||
print(" done")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not os.path.isdir(OUTPUT_DIR):
|
||||
os.mkdir(OUTPUT_DIR)
|
||||
|
||||
for graphics_file in sys.argv[1:]:
|
||||
export_objects(
|
||||
graphics_file,
|
||||
filter(id_filter, get_all_ids(graphics_file)),
|
||||
)
|
||||
130
scripts/generate_layouts.py
Normal file
130
scripts/generate_layouts.py
Normal file
@@ -0,0 +1,130 @@
|
||||
import os
|
||||
from typing import *
|
||||
|
||||
OUTPUT_DIR = "._layouts"
|
||||
|
||||
# Card size info
|
||||
TOTAL_HEIGHT = 30
|
||||
TOTAL_WIDTH = 22
|
||||
BLEED_MARGIN = 1
|
||||
SAFE_MARGIN = 2
|
||||
MAX_SAFE_X = TOTAL_WIDTH - SAFE_MARGIN
|
||||
MAX_SAFE_Y = TOTAL_HEIGHT - SAFE_MARGIN
|
||||
|
||||
# Icon info
|
||||
ICON_SIZE = 3.7
|
||||
ICON_MARGIN_LEFT = 0
|
||||
ICON_MARGIN_TOP = 0
|
||||
ICON_X = ICON_MARGIN_LEFT + SAFE_MARGIN
|
||||
ICON_Y = ICON_MARGIN_TOP + SAFE_MARGIN
|
||||
|
||||
# Banner info
|
||||
BANNER_WIDTH = 2
|
||||
BANNER_HEIGHT = 6
|
||||
BANNER_X = ICON_X + ICON_SIZE + 0.3
|
||||
BANNER_Y = 0
|
||||
BANNER_TEXT_FONT = "\"ethnocentric 12\""
|
||||
BANNER_TEXT_X = BANNER_X - 0.3
|
||||
BANNER_TEXT_Y = BANNER_HEIGHT / 3
|
||||
BANNER_TEXT_WIDTH = BANNER_WIDTH + 0.6
|
||||
|
||||
# Name info
|
||||
NAME_X = ICON_X + ICON_SIZE
|
||||
NAME_Y = SAFE_MARGIN + 0.1
|
||||
NAME_WIDTH = MAX_SAFE_X - NAME_X
|
||||
NAME_HEIGHT = 3.4
|
||||
NAME_FONT = "\"ethnocentric 11\""
|
||||
|
||||
NAME_WITH_BANNER_X = BANNER_X + BANNER_WIDTH
|
||||
NAME_WITH_BANNER_WIDTH = NAME_WIDTH - (NAME_WITH_BANNER_X - NAME_X)
|
||||
|
||||
def central_sym(x: int, y: int) -> Tuple[int, int]:
|
||||
return TOTAL_WIDTH - x, TOTAL_HEIGHT - y
|
||||
|
||||
# Alternative objects
|
||||
ALT_ICON_X, ALT_ICON_Y = central_sym(ICON_X, ICON_Y)
|
||||
ALT_BANNER_X, ALT_BANNER_Y = central_sym(BANNER_X, BANNER_Y)
|
||||
ALT_BANNER_TEXT_X, ALT_BANNER_TEXT_Y = central_sym(BANNER_TEXT_X, BANNER_TEXT_Y)
|
||||
|
||||
POKER_LAYOUT: str = f"""
|
||||
icon:
|
||||
x: {ICON_X}c
|
||||
y: {ICON_Y}c
|
||||
width: {ICON_SIZE}c
|
||||
height: {ICON_SIZE}c
|
||||
|
||||
alt_icon:
|
||||
extends: icon
|
||||
x: {ALT_ICON_X}c
|
||||
y: {ALT_ICON_Y}c
|
||||
angle: 3.14159
|
||||
|
||||
banner:
|
||||
x: {BANNER_X}c
|
||||
y: {BANNER_Y}c
|
||||
width: {BANNER_WIDTH}c
|
||||
height: {BANNER_HEIGHT}c
|
||||
|
||||
banner_text:
|
||||
x: {BANNER_TEXT_X}c
|
||||
y: {BANNER_TEXT_Y}c
|
||||
width: {BANNER_TEXT_WIDTH}c
|
||||
height: 1c
|
||||
font: {BANNER_TEXT_FONT}
|
||||
align: center
|
||||
# hint: blue
|
||||
|
||||
alt_banner:
|
||||
extends: banner
|
||||
x: {ALT_BANNER_X}c
|
||||
y: {ALT_BANNER_Y}c
|
||||
angle: 3.14159
|
||||
|
||||
|
||||
alt_banner_text:
|
||||
extends: banner_text
|
||||
angle: 3.14159
|
||||
x: {ALT_BANNER_TEXT_X}c
|
||||
y: {ALT_BANNER_TEXT_Y}c
|
||||
|
||||
name:
|
||||
x: {NAME_X}c
|
||||
y: {NAME_Y}c
|
||||
width: {NAME_WIDTH}c
|
||||
height: {NAME_HEIGHT}c
|
||||
align: center
|
||||
valign: middle
|
||||
font: {NAME_FONT}
|
||||
# hint: red
|
||||
|
||||
name_with_banner:
|
||||
extends: name
|
||||
x: {NAME_WITH_BANNER_X}c
|
||||
width: {NAME_WITH_BANNER_WIDTH}c
|
||||
|
||||
border:
|
||||
x: 0
|
||||
y: 0
|
||||
width: {TOTAL_WIDTH}c
|
||||
height: {TOTAL_HEIGHT}c
|
||||
|
||||
cut:
|
||||
x: {BLEED_MARGIN}c
|
||||
y: {BLEED_MARGIN}c
|
||||
width: {TOTAL_WIDTH - (2 * BLEED_MARGIN)}c
|
||||
height: {TOTAL_HEIGHT - (2 * BLEED_MARGIN)}c
|
||||
stroke_color: gray
|
||||
|
||||
safe:
|
||||
x: {SAFE_MARGIN}c
|
||||
y: {SAFE_MARGIN}c
|
||||
width: {TOTAL_WIDTH - (2 * SAFE_MARGIN)}c
|
||||
height: {TOTAL_HEIGHT - (2 * SAFE_MARGIN)}c
|
||||
radius: 0.4c
|
||||
dash: 0.5mm 0.5mm
|
||||
"""
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not os.path.isdir(OUTPUT_DIR):
|
||||
os.mkdir(OUTPUT_DIR)
|
||||
open(f"{OUTPUT_DIR}/poker.yml", "w").write(POKER_LAYOUT)
|
||||
Reference in New Issue
Block a user