From f9071f5209edaab3e536add62997ceec3b7410dd Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 21 Jul 2020 19:01:04 -0500 Subject: [PATCH] yaml-ify --- .gitignore | 1 + Makefile | 4 +-- _data/assets.yml | 6 ++-- readfile.scad | 2 +- resources/gen/main.png | Bin 5305 -> 5001 bytes resources/gen/main.stl | Bin 684 -> 684 bytes resources/main.scad | 6 +++- rules.mk | 17 +++++++++- rules.py | 75 ++++++++++++++++++++++------------------- 9 files changed, 68 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index b4dfc49..d485daf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .jekyll-cache _site/ +resources/gen diff --git a/Makefile b/Makefile index 3b969b0..2eac700 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ default:: clean: rm -rf resources/gen -rules.mk: files.gen rules.py - ./rules.py files.gen > rules.mk +rules.mk: _data/assets.yml rules.py + ./rules.py $< > $@ -include rules.mk diff --git a/_data/assets.yml b/_data/assets.yml index 688a356..5167865 100644 --- a/_data/assets.yml +++ b/_data/assets.yml @@ -5,6 +5,6 @@ - name: Big Featureless Cube scad: main.scad - flags: -Dsize=100 - stl: gen/main.stl - images: ['gen/main.png'] + flags: -Dsize=100 -Dcolor="red" + stl: gen/big.stl + images: ['gen/big.png'] diff --git a/readfile.scad b/readfile.scad index b117d7e..a0e67c1 100644 --- a/readfile.scad +++ b/readfile.scad @@ -1,2 +1,2 @@ -CONVEXITY=4 +CONVEXITY=4; import(input, convexity=CONVEXITY); diff --git a/resources/gen/main.png b/resources/gen/main.png index 4e0b68105f0026486b590b4a360744da46f661f1..38cbeaf95fa1bbe3e55c5a9a9462ce1ddd20af7f 100644 GIT binary patch literal 5001 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 NZZ4kAC5y!g{{u`>T#Enz literal 5305 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 literal 684 zcmb7AO9}!p4DA8*4n4sjxN%m4;8ySqYQfn!Fa^O~Zsyf&l6g(4ZVa?9pZAiqr+K=h zoYOU)pK*UUrhJQ!H0N=;$4%Gox^4K&R?4OY216=7A2#@kYfUy4uz*l%+$dfmtQUGi zsRdDx`cxF2rCGam7G^N})36PY>ohb9YG3O+n2Hq=6*e0xj5x?^TouCqW_h+!>Q<#^ opjP48nCITXip8v|9eh3n+3LqXc@}qIQ>+S-q+FO`8S{9nH)YR5G5`Po diff --git a/resources/main.scad b/resources/main.scad index 406bf16..178ca71 100644 --- a/resources/main.scad +++ b/resources/main.scad @@ -1 +1,5 @@ -cube(); +size = 10; +color = "blue"; + +color(color) +cube(size); diff --git a/rules.mk b/rules.mk index 5096447..743a266 100644 --- a/rules.mk +++ b/rules.mk @@ -1,4 +1,3 @@ -# resources/gen/main has no recognized extension -include resources/gen/main.stl.d resources/gen/main.stl: resources/main.scad @@ -15,3 +14,19 @@ resources/gen/main.png: resources/main.scad openscad -o resources/gen/main.png -d resources/gen/main.png.d $(SCAD_FLAGS) resources/main.scad default:: resources/gen/main.png + +-include resources/gen/big.stl.d +resources/gen/big.stl: resources/main.scad + mkdir -p $(dir resources/gen/big.stl) + openscad -o resources/gen/big.stl.tmp.stl -d resources/gen/big.stl.d $(SCAD_FLAGS) -Dsize=100 '-Dcolor="red"' resources/main.scad + admesh -b resources/gen/big.stl resources/gen/big.stl.tmp.stl + rm -f resources/gen/big.stl.tmp.stl +default:: resources/gen/big.stl + + +-include resources/gen/big.png.d +resources/gen/big.png: resources/main.scad + mkdir -p $(dir resources/gen/big.png) + openscad -o resources/gen/big.png -d resources/gen/big.png.d $(SCAD_FLAGS) -Dsize=100 '-Dcolor="red"' resources/main.scad +default:: resources/gen/big.png + diff --git a/rules.py b/rules.py index dc00a60..36c6e88 100755 --- a/rules.py +++ b/rules.py @@ -1,7 +1,12 @@ #!/usr/bin/python3 import os +import pathlib +import shlex import sys +import yaml + +resources = pathlib.Path("resources") MAKE_SCAD_STL = """ -include {target}.d @@ -13,6 +18,16 @@ MAKE_SCAD_STL = """ default:: {target} """ +MAKE_SCAD_SVG = """ +-include {target}.d +{target}: {src} +\tmkdir -p $(dir {target}) +\topenscad -o {target}.tmp.svg -d {target}.d $(SCAD_FLAGS) {flags} {src} +\tadmesh -b {target} {target}.tmp.svg +\trm -f {target}.tmp.svg +default:: {target} +""" + MAKE_SCAD_PNG = """ -include {target}.d {target}: {src} @@ -25,45 +40,35 @@ MAKE_STL_PNG = """ -include {target}.d {target}: {src} \tmkdir -p $(dir {target}) -\topenscad -o {target} -d {target}.d $(SCAD_FLAGS) {flags} -Dinput=\"{src}\" readfile.scad +\topenscad -o {target} -d {target}.d $(SCAD_FLAGS) {flags} -Dinput=\\\"{src}\\\" readfile.scad default:: {target} """ with open(sys.argv[1]) as f: - for row in f: - parts = row.split(":", 2) - if len(parts) == 1: - target = parts - src = f"{target}.scad" - if not os.exists(src): - src = f"{target}.stl" - flags = "" - if len(parts) == 2: - target, src = parts - flags = "" - else: - target, src, flags = parts + doc = yaml.safe_load(f) - target = target.strip() - src = src.strip() - flags = flags.strip() +for row in doc: + flags = row.get('flags', '') + if isinstance(flags, str): + flags = flags.split() + flags = " ".join(shlex.quote(f) for f in flags) + scad = row.get('scad', '') + stl = row.get('stl', '') + svg = row.get('svg', '') + + if stl.startswith('gen/'): + print(MAKE_SCAD_STL.format( + **{'target': resources / stl, 'src': resources / scad, 'flags': flags})) - src = f"resources/{src}" - target = f"resources/gen/{target}" + if svg.startswith('gen/'): + print(MAKE_SCAD_SVG.format( + **{'target': resources / svg, 'src': resources / scad, 'flags': flags})) - if src.lower().endswith(".scad"): - if target.lower().endswith(".stl"): - print(MAKE_SCAD_STL.format(**{'target': target, 'src': src, 'flags': flags})) - elif target.lower().endswith(".png"): - print(MAKE_SCAD_PNG.format(**{'target': target, 'src': src, 'flags': flags})) - else: - print(f"# {target} has no recognized extension") - print(MAKE_SCAD_STL.format(**{'target': f"{target}.stl", 'src': src, 'flags': flags})) - print(MAKE_SCAD_PNG.format(**{'target': f"{target}.png", 'src': src, 'flags': flags})) - elif src.lower().endswith(".stl"): - if target.lower().endswith(".png"): - print(MAKE_STL_PNG.format(**{'target': target, 'src': src, 'flags': flags})) - else: - print(MAKE_STL_PNG.format(**{'target': f"{target}.png", 'src': src, 'flags': flags})) - else: - raise RuntimeError(f"Don't know how to handle {src} -> {target}") + for png in row.get('images', []): + if png.startswith('gen/'): + if scad: + print(MAKE_SCAD_PNG.format( + **{'target': resources / png, 'src': resources / scad, 'flags': flags})) + else: + print(MAKE_STL_PNG.format( + **{'target': resources / png, 'src': resources / stl, 'flags': flags}))