Improve print layout options and character packing

This commit is contained in:
ajp_anton
2026-05-31 12:32:49 +00:00
parent 47748f3897
commit 4f9eb9ec60
4 changed files with 228 additions and 65 deletions
+27 -4
View File
@@ -98,6 +98,21 @@ def prompt_positive_int(label: str, default: int) -> int:
return parsed
def prompt_nonnegative_float(label: str, default: float) -> float:
value = input(f"{label} [{default:g}]: ").strip()
if not value:
return default
try:
parsed = float(value)
except ValueError:
print(f"Invalid number '{value}', using {default:g}.")
return default
if parsed < 0:
print(f"Unsupported value '{parsed:g}', using {default:g}.")
return default
return parsed
def prompt_bool(label: str, default: bool) -> bool:
suffix = "Y/n" if default else "y/N"
value = input(f"{label} [{suffix}]: ").strip().lower()
@@ -183,7 +198,7 @@ def default_config() -> BuildConfig:
project_version=load_project_version(),
starter_unique_colors=True,
rent_raised_count=3,
margin_mm=12.0,
margin_mm=10.0,
bleed_mm=1.0,
clean_edge_mm=0.35,
output_pdf_name="",
@@ -198,7 +213,8 @@ def interactive_config() -> BuildConfig:
dpi = prompt_int("DPI", default.dpi, [300, 600])
crop = prompt_bool("Crop black borders", default.crop_black_borders)
card_mm = prompt_card_size(default.card_mm)
board_mode, custom_board = prompt_board_mode(PAPER_SIZES_MM[paper], default.margin_mm)
margin_mm = prompt_nonnegative_float("Page margin in mm", default.margin_mm)
board_mode, custom_board = prompt_board_mode(PAPER_SIZES_MM[paper], margin_mm)
unify_starter_colors = prompt_bool("Unify starter badge colors", not default.starter_unique_colors)
rent_raised_count = prompt_positive_int("Number of Rent raised", default.rent_raised_count)
gamma_enabled, gamma, black_point = prompt_gamma()
@@ -217,7 +233,7 @@ def interactive_config() -> BuildConfig:
project_version=default.project_version,
starter_unique_colors=not unify_starter_colors,
rent_raised_count=rent_raised_count,
margin_mm=default.margin_mm,
margin_mm=margin_mm,
bleed_mm=default.bleed_mm,
clean_edge_mm=default.clean_edge_mm,
output_pdf_name=output_pdf_name,
@@ -232,6 +248,7 @@ def parse_args(argv=None) -> argparse.Namespace:
parser.add_argument("--dpi", type=int, choices=[300, 600], help="Override DPI.")
parser.add_argument("--paper", choices=sorted(PAPER_SIZES_MM), help="Override paper size.")
parser.add_argument("--card-size", metavar="SIZE", type=parse_card_size_arg, help="Override card size by name or WIDTHxHEIGHT in mm.")
parser.add_argument("--margin", type=float, help="Page margin in millimeters.")
parser.add_argument("--crop", action="store_true", help="Crop black borders.")
parser.add_argument("--no-gamma", action="store_true", help="Disable print brightening gamma.")
parser.add_argument("--render-only", action="store_true", help="Render source card/board PNGs and skip page/PDF creation.")
@@ -255,6 +272,11 @@ def apply_overrides(config: BuildConfig, args: argparse.Namespace) -> BuildConfi
if args.rent_raised <= 0:
raise SystemExit("--rent-raised must be a positive non-zero integer.")
rent_raised_count = args.rent_raised
margin_mm = config.margin_mm
if args.margin is not None:
if args.margin < 0:
raise SystemExit("--margin must not be negative.")
margin_mm = args.margin
return BuildConfig(
paper_name=paper_name,
paper_mm=PAPER_SIZES_MM[paper_name],
@@ -269,7 +291,7 @@ def apply_overrides(config: BuildConfig, args: argparse.Namespace) -> BuildConfi
project_version=config.project_version,
starter_unique_colors=(args.starter_colors == "separate") if args.starter_colors else config.starter_unique_colors,
rent_raised_count=rent_raised_count,
margin_mm=config.margin_mm,
margin_mm=margin_mm,
bleed_mm=config.bleed_mm,
clean_edge_mm=config.clean_edge_mm,
output_pdf_name=args.output if args.output is not None else config.output_pdf_name,
@@ -294,6 +316,7 @@ def main(argv=None) -> None:
card version: {config.project_version or '<none>'}
starter badge colors: {'different player colors' if config.starter_unique_colors else 'same color per starter deck'}
Rent raised cards: {config.rent_raised_count}
margin: {config.margin_mm:g} mm
bleed: {config.bleed_mm} mm ({mm_to_px(config.bleed_mm, config.dpi)} px at {config.dpi} DPI)
crop black borders: {'yes' if config.crop_black_borders else 'no'}
gamma: {'off' if not config.gamma_enabled else f'{config.gamma} with black point {config.black_point}'}