-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathjustfile
More file actions
109 lines (87 loc) · 5.03 KB
/
justfile
File metadata and controls
109 lines (87 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
paths:
mkdir -p paths
uv run extract_paths.py puzzle.svg paths/puzzle.scad
test:
openscad -o /dev/null --export-format=stl test.scad
clean-docs:
# docs task will delete any images it didn't write
mkdir -p docs/images
banner name:
inkscape -w 486 -h 364 docs/{{name}}.svg -o docs/{{name}}.png
banners: (banner "banner-generator-yawkat") (banner "banner-generator-perplexinglabs")
docs:
#!/usr/bin/env -S uv run --script
import re
import shlex
import subprocess
import os
import asyncio
openscad_pattern = re.compile(r"^\s*<!--\s*openscad (.+)\s*-->\s*$")
concurrency = asyncio.Semaphore(8)
async def run(cmd, output):
async with concurrency:
print("Running: " + shlex.join(cmd))
proc = await asyncio.create_subprocess_exec(*cmd)
await proc.wait()
assert proc.returncode == 0
if os.path.getsize(output) == 7763:
# render failure, retry
print(f"Render failure for `{shlex.join(cmd)}`, retrying")
await run(cmd, output)
async def main():
tasks = []
written = []
for line in open("README.md"):
match = openscad_pattern.match(line)
if match:
cmd = ["openscad", "--hardwarnings", "--projection=ortho", "--colorscheme=Starnight", "--render", "--imgsize=2500,1000", *shlex.split(match.group(1))]
# use gridflock.scad if no other file specified
for c in cmd:
if ".scad" in c:
break
else:
cmd.append("gridflock.scad")
output = cmd[cmd.index("-o") + 1]
tasks.append(run(cmd, output))
written.append(output)
for f in os.listdir("docs/images"):
if os.path.join("docs/images", f) not in written:
os.unlink(os.path.join("docs/images", f))
await asyncio.gather(*tasks)
asyncio.run(main())
overlay-png name:
inkscape -w 1600 -h 1200 docs/{{name}}.svg -o build/{{name}}.png
animation file frames delay args overlay: (overlay-png "{{name}}")
rm -rf build/animate/{{file}}
mkdir -p build/animate/{{file}}
openscad --colorscheme=Prusa --imgsize=1600,1200 --render -o build/animate/{{file}}/frame.png -D total_frames={{frames}} --animate {{frames}} {{args}} docs/{{file}}.scad
mogrify -alpha set -channel alpha -fx "g == 1.0 ? 0 : 1" build/animate/{{file}}/*
mogrify -draw 'image SrcOver 0,0 1600,1200 build/{{overlay}}.png' build/animate/{{file}}/*
magick -delay {{delay}} -loop 0 -dispose previous build/animate/{{file}}/* build/{{file}}.gif
title: (overlay-png "caption-title")
openscad --colorscheme=Prusa --imgsize=1600,1200 --projection=ortho --camera 0,0,0,20,0,40,500 --render -o build/title.png docs/title.scad
mogrify -alpha set -channel alpha -fx "g == 1.0 ? 0 : 1" build/title.png
mogrify -draw 'image SrcOver 0,0 1600,1200 build/caption-title.png' build/title.png
#[parallel]
showcase: title (animation "animation-size" "11" "80" "-D magnets=false" "caption-size") (animation "animation-magnets" "3" "100" "" "caption-magnets") (animation "animation-size-smooth" "30" "10" "-D magnets=false --camera 0,0,0,40,0,40,400" "caption-size-smooth")
dir_intersection_fit := "build/printables/Intersection connector fit calibration files"
intersection-fit-tester-one fit:
mkdir -p "{{dir_intersection_fit}}"
openscad -o "{{dir_intersection_fit}}/fit-{{fit}}.stl" --export-format=binstl -D magnets=false -D BASEPLATE_DIMENSIONS='[15, 42]' -D 'plate_size=[30, 84]' -D 'bed_size=[25, 1000]' -D intersection_puzzle_fit={{fit}} gridflock.scad
intersection-fit-tester: (intersection-fit-tester-one "0.0") (intersection-fit-tester-one "0.2") (intersection-fit-tester-one "0.4") (intersection-fit-tester-one "0.6") (intersection-fit-tester-one "0.8") (intersection-fit-tester-one "1.0")
clean-printables-zip:
rm -rf build/printables
dir_magnet_insertion := "build/printables/Magnet Insertion Jig"
dir_source := "build/printables/OpenSCAD Source"
dir_clickgroove := "build/printables/ClickGroove Files"
printables-zip: clean-printables-zip paths (intersection-fit-tester-one "0.0") (intersection-fit-tester-one "0.2") (intersection-fit-tester-one "0.4") (intersection-fit-tester-one "0.6") (intersection-fit-tester-one "0.8") (intersection-fit-tester-one "1.0")
mkdir -p "{{dir_magnet_insertion}}"
openscad -o "{{dir_magnet_insertion}}"/jig.stl --hardwarnings --export-format=binstl -D part='"jig"' -D show_cross_section=false mag_insert_jig.scad
openscad -o "{{dir_magnet_insertion}}"/pusher.stl --hardwarnings --export-format=binstl -D part='"pusher"' mag_insert_jig.scad
mkdir -p "{{dir_clickgroove}}"
openscad -o "{{dir_clickgroove}}/ClickGroove Bin Template.stl" --hardwarnings --export-format=binstl clickgroove-base.scad
mkdir -p "{{dir_source}}"
cp -r paths gridflock.scad "{{dir_source}}"
rm -f build/printables.zip
cd build/printables && zip -r ../printables.zip .
all: paths test showcase docs printables-zip banners