#!/usr/bin/env python3 from jinja2 import Template from lxml import etree from pyppeteer import launch from quart import Quart, request, render_template, url_for, redirect from subprocess import run import asyncio import os app = Quart(__name__) def run_check(*args, **kwargs): return run(*args, **kwargs, check=True) async def gen_pdf(name): browser = await launch(args=["--no-sandbox"]) page = await browser.newPage() await page.goto("file://" + os.path.join(os.getcwd(), "namensschild.html")) await page.evaluate(f"setName('{name}')") await page.pdf(path=f"static/{name}.pdf", width="180px", height="60px") await browser.close() def gen_svg(name): # OpenSCAD only supports a small subset of SVG (namely no clips, transforms # and uses). Experiments lead to the result that chaining some conversions # removes all those. run_check( ["inkscape", "-T", "-E", f"static/{name}.eps", f"static/{name}.pdf",] ) run_check( ["inkscape", "-T", "-A", f"static/{name}.pdf", f"static/{name}.eps",] ) run_check(["mutool", "convert", "-o", f"static/{name}.svg", f"static/{name}.pdf"]) # for some reason mutool exports to {name}1 instead onf {name}… tree = etree.parse(f"static/{name}1.svg") root = tree.getroot() # background del root[0][0][0] tree.write(f"static/{name}.svg") def gen_stl(name): with open("namensschild.scad.j2", "r") as f: template = Template(f.read()) with open(f"static/{name}.scad", "w") as f: f.write(template.render(name=name)) run_check(["openscad", "-o", f"static/{name}.stl", f"static/{name}.scad"]) @app.route("/") async def index(): return await render_template("index.html.j2") @app.route("/generate") async def generate(): name = request.args["name"] await gen_pdf(name) gen_svg(name) gen_stl(name) return redirect(url_for("static", filename=f"{name}.stl"), code=302) if __name__ == "__main__": app.run(debug=True)