2019-03-27 20:30:59 +01:00
|
|
|
#!/usr/bin/env python3
|
2020-04-29 15:29:35 +02:00
|
|
|
from jinja2 import Template
|
2020-04-29 17:27:06 +02:00
|
|
|
from lxml import etree
|
2020-04-29 05:08:19 +02:00
|
|
|
from pyppeteer import launch
|
|
|
|
from quart import Quart, request, render_template, url_for, redirect
|
2019-03-27 20:30:59 +01:00
|
|
|
from subprocess import run
|
2020-04-29 05:08:19 +02:00
|
|
|
import asyncio
|
|
|
|
import os
|
|
|
|
|
|
|
|
app = Quart(__name__)
|
|
|
|
|
2019-03-27 20:30:59 +01:00
|
|
|
|
|
|
|
def run_check(*args, **kwargs):
|
|
|
|
return run(*args, **kwargs, check=True)
|
|
|
|
|
2020-04-29 05:08:19 +02:00
|
|
|
|
|
|
|
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"))
|
2020-04-29 16:26:14 +02:00
|
|
|
await page.evaluate(f"setName('{name}')")
|
2020-04-29 15:29:35 +02:00
|
|
|
await page.pdf(path=f"static/{name}.pdf", width="180px", height="60px")
|
2020-04-29 05:08:19 +02:00
|
|
|
await browser.close()
|
|
|
|
|
|
|
|
|
2020-04-29 17:27:06 +02:00
|
|
|
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.
|
2020-04-29 05:08:19 +02:00
|
|
|
run_check(
|
2020-04-29 15:29:35 +02:00
|
|
|
["inkscape", "-T", "-E", f"static/{name}.eps", f"static/{name}.pdf",]
|
2020-04-29 05:08:19 +02:00
|
|
|
)
|
|
|
|
run_check(
|
2020-04-29 17:27:06 +02:00
|
|
|
["inkscape", "-T", "-A", f"static/{name}.pdf", f"static/{name}.eps",]
|
2020-04-29 05:08:19 +02:00
|
|
|
)
|
2020-04-29 17:27:06 +02:00
|
|
|
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")
|
|
|
|
|
2020-04-29 15:29:35 +02:00
|
|
|
|
2020-04-29 17:27:06 +02:00
|
|
|
def gen_stl(name):
|
2020-04-29 15:29:35 +02:00
|
|
|
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"])
|
|
|
|
|
2020-04-29 17:27:06 +02:00
|
|
|
|
|
|
|
@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)
|
2020-04-29 05:08:19 +02:00
|
|
|
return redirect(url_for("static", filename=f"{name}.stl"), code=302)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
app.run(debug=True)
|