cad/mkbd65.py
2022-02-22 19:28:52 +01:00

107 lines
4.9 KiB
Python
Executable file

#!/usr/bin/env python3
import sys
from subprocess import run
from configparser import ConfigParser
import click
from solid import scad_render_to_file
from mkbd65.key_mat import key_mat, key
from mkbd65.pcb import pcb
from mkbd65.phone import phone
from mkbd65.lower_case import lower_case
@click.command()
@click.option("-l", "--layout", "layout", default="ansi", show_default=True, help="Keyboard layout", type=click.Choice(["ansi", "ansi_big_enter", "iso"], case_sensitive=False))
@click.option("-v", "--variant", "variant", default="en", show_default=True, help="Keyboard layout variant", type=click.Choice(["en", "de"], case_sensitive=False))
@click.option("-s", "--stl", "stl", is_flag=True, help="Generate STL files")
@click.option("-3", "--3mf", "emf", is_flag=True, help="Generate 3MF files")
@click.option("-a", "--amf", "amf", is_flag=True, help="Generate AMF files")
@click.option("-d", "--detail", "detail", default=64, show_default=True, help="OpenSCAD detail level", type=click.INT)
@click.argument("config_file")
def cli(layout, variant, stl, emf, amf, detail, config_file):
if layout == "ansi" and variant == "de":
click.echo("There is no german ansi variant. German keyboards need one more key and therefore use the ISO layout.")
sys.exit()
config = ConfigParser()
config.read(config_file)
components = [
["phone", phone(
width=config.getfloat("phone", "width"),
height=config.getfloat("phone", "height"),
thickness=config.getfloat("phone", "thickness"),
corner_radius=config.getfloat("phone", "corner_radius"),
side_radius=config.getfloat("phone", "side_radius")
)],
["key", key(
width=config.getfloat("key_mat", "key_width", fallback=9),
height=config.getfloat("key_mat", "key_height", fallback=6),
thickness=config.getfloat("key_mat", "key_thickness", fallback=2),
corner_radius=config.getfloat("key_mat", "key_corner_radius", fallback=1),
label="❤️",
font=config.get("key_mat", "font", fallback="DejaVu Sans:style=Bold")
)],
["key_mat", key_mat(
margin=config.getfloat("key_mat", "margin", fallback=1),
padding=config.getfloat("key_mat", "padding", fallback=1),
thickness=config.getfloat("key_mat", "thickness", fallback=0.5),
key_width=config.getfloat("key_mat", "key_width", fallback=9),
key_height=config.getfloat("key_mat", "key_height", fallback=6),
key_radius=config.getfloat("key_mat", "key_corner_radius", fallback=1),
key_thickness=config.getfloat("key_mat", "key_thickness", fallback=2),
layout=layout,
variant=variant,
font=config.get("key_mat", "font", fallback="DejaVu Sans:style=Bold")
)],
["pcb", pcb(
key_width=config.getfloat("key_mat", "key_width", fallback=9),
key_height=config.getfloat("key_mat", "key_height", fallback=6),
key_padding=config.getfloat("key_mat", "padding", fallback=1)
)],
["lower_case", lower_case(
phone_width=config.getfloat("phone", "width"),
phone_height=config.getfloat("phone", "height"),
phone_radius=config.getfloat("phone", "corner_radius")
)],
["test_key_mat", key_mat(
margin=config.getfloat("key_mat", "margin", fallback=1),
padding=config.getfloat("key_mat", "padding", fallback=1),
thickness=config.getfloat("key_mat", "thickness", fallback=0.5),
key_width=config.getfloat("key_mat", "key_width", fallback=9),
key_height=config.getfloat("key_mat", "key_height", fallback=6),
key_radius=config.getfloat("key_mat", "key_corner_radius", fallback=1),
key_thickness=config.getfloat("key_mat", "key_thickness", fallback=2),
layout=layout,
variant=variant,
font=config.get("key_mat", "font", fallback="DejaVu Sans:style=Bold"),
keys_h=5,
keys_v=3
)]
]
for component in components:
print(f"Render component {component[0]}...")
scad_render_to_file(
component[1],
filepath=f"mkbd65_{component[0]}.scad",
file_header=f'$fn = {detail};',
include_orig_code=False
)
if stl:
print(f"Generate STL for component {component[0]}...")
run(["openscad", "-o", f"mkbd65_{component[0]}.stl", f"mkbd65_{component[0]}.scad"])
if emf:
print(f"Generate 3MF for component {component[0]}...")
run(["openscad", "-o", f"mkbd65_{component[0]}.3mf", f"mkbd65_{component[0]}.scad"])
if amf:
print(f"Generate AMF for component {component[0]}...")
run(["openscad", "-o", f"mkbd65_{component[0]}.amf", f"mkbd65_{component[0]}.scad"])
if __name__ == "__main__":
cli()