nicklockwood / nicklockwood/ShapeScript
Support for variables, scripting support
Nobody has claimed this yet.
- Dominant language
- Swift
- Stars
- 440
- Forks
- 25
- PR merge metrics
- No merged PRs in 30d
Description
I'm an OpenSCAD user and make use of its command line interface to export automated variations of my models. I use:
$tto change the camera (32 rotations)- other variables to adjust wheel turning, tilt body, etc (9 combinations)
My issues with OpenSCAD are:
- performance (single-threaded)
- user interface (not native)
- fixed lighting
So, I was wondering if there are plans to add support for variables and scripting (CLI, AppleScript, internal, etc)
Cheers!
matt from Cornwall
--
Example final output from my Makefile (render, resize, stitch, convert to 1-bit):

And the OpenSCAD model used:
// use only in editor, not in CLI batch
$vpr = [45,0,180-$t*360];
$vpt = [0,0,100];
$vpd = 9000;
s = 30;
h = s/2;
d = s*2;
w = h*4.5;
body = "#333";
trim = "#FFF";
black = "#000";
white = "#FFF";
glass = "#FFF";
rr = 1;
rl = 0;
rside = 2;
rf = 0;
rb = 0;
rfwd = 2;
shad = -1;
if (shad == 0 || shad == -1) {
rotate([0,0,180])
translate([-h,-d,0])
car();
}
if (shad == 1 || shad == -1) {
rotate([0,0,180])
translate([-h,-d,0])
realshadow();
}
module car() {
// rear wheels
translate([s*0.84, s*1.75, h])
wheel();
translate([-s*0.84, s*1.75, h])
wheel();
// front wheels
if (rr == 1) {
translate([s*0.84, s*3.5, h])
translate([4,-7,0])
rotate([0,0,30])
wheel();
}
if (rl == 1) {
translate([s*0.84, s*3.5, h])
translate([4,9,0])
rotate([0,0,-35])
wheel();
}
if (!rr && !rl) {
translate([s*0.84, s*3.5, h])
wheel();
}
if (rr == 1) {
translate([-s*0.84, s*3.5, h])
translate([0,-8,0])
rotate([0,0,35])
wheel();
}
if (rl == 1) {
translate([-s*0.84, s*3.5, h])
translate([0,7,0])
rotate([0,0,-30])
wheel();
}
if (!rr && !rl) {
translate([-s*0.84, s*3.5, h])
wheel();
}
rotate([-rfwd*rf+rfwd*rb,-rside*rl+rside*rr,0])
translate([0,0,-rfwd*rb+rfwd*rf])
union() {
// gas can
color(white)
translate([-h/2,d*1.85,d*0.88])
rotate([0,90,0])
cylinder(s*1.5,8,8);
// rear grille
*color(white)
translate([-9,d*1.975,s*.75])
cube([d*0.8,10,15]);
// exhausts
color(white)
hull() {
color(white)
translate([0, 128, 30])
rotate([90,0,0])
cylinder(5,8,8);
color(white)
translate([30, 128, 30])
rotate([90,0,0])
cylinder(5,8,8);
}
difference() {
body();
// wheel arches
union() {
translate([s*0.75, s*1.75, h])
arch();
translate([-s*0.75, s*1.75, h])
arch();
translate([s*0.75, s*3.5, h])
arch();
translate([-s*0.75, s*3.5, h])
arch();
}
}
}
}
module body() {
color(body)
union() {
difference() {
body_main();
// fork
translate([15,-5,55])
cube([d+1,d+1,d*1.2], center = true);
// fork gap
translate([15,-5,20])
cube([s*1.3,d+1,s], center = true);
// fork gap v r
translate([-15,16,53])
cube([s,s,d*1.2], center = true);
// fork gap v m
translate([15,16,53])
cube([h,s,d*1.2], center = true);
// fork gap v l
translate([45,16,53])
cube([s,s,d*1.2], center = true);
// fork cut
translate([15,35,66])
cube([d+1,s/3,d], center = true);
// roof cut
translate([15,70,83])
cube([d+1,d+1,h], center = true);
// rear cut
translate([15,136,75])
cube([d+1,d+1,d], center = true);
// front cut
color(glass)
translate([46,105-s,40])
rotate([90,0,-90])
linear_extrude(0,0,62)
polygon(points=[[40,50],[20,50],[35,-4]]);
// rear cut
color(glass)
translate([46,140,40])
rotate([90,0,-90])
linear_extrude(0,0,62)
polygon(points=[[55,50],[30,50],[30,5],[45,5]]);
// front and back windows
color(white)
translate([-11,35,44])
rotate([1,0,0])
cube([52,d*1.2,28]);
// side windows
color(white)
translate([46,105-s,35])
rotate([90,0,-90])
linear_extrude(0,0,62)
polygon(points=[[-10,37],[-16,10],[30,2],[21,37]]);
}
}
// interior
color("white")
translate([15,70,41])
rotate([10,0,0])
cube([d*0.9,d*0.65,1], center = true);
}
module body_main() {
difference() {
// body box
color(body)
translate([-h, -h, h])
cube([s*2,s*4.75,s*2.4]);
}
}
module wheel() {
difference() {
// tyre
translate([s/3,0,0])
color(black)
rotate([0,90,0])
cylinder(s/3,h*1,h*1);
// tyre hole
color(white)
translate([h/2,0,0])
rotate([0,90,0])
cylinder(h,s/3,s/3);
}
// hub cap
color(white)
translate([h*0.75,0,0])
rotate([0,90,0])
cylinder(h/2,s/3,s/3);
}
module arch() {
// hole
translate([4.5,0,0])
color(white)
rotate([0,90,0])
cylinder(s*0.7,s*0.6,s*0.6);
}
module mark() {
translate([h/4,0,0])
color(black)
square([s/2,s/2],0);
}
module realshadow() {
N = [[ 1 , 0 , 0 , 0 ],
[ 0 , 1 , 0 , 0 ],
[ 0 , 0 , 0.01 , 0 ],
[ 0 , 0 , 0 , 1 ] ];
color([0,0,0, 1])
translate([0,0,-4])
multmatrix(N)
car();
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The issue provides no ShapeScript files, tests, or entry points to start from. First clarify whether the goal is OpenSCAD-style variables, CLI batch scripting, AppleScript, or internal scripting, then define an agreed scope and an example workflow that demonstrates the completed support.
Written by the indexing model from the issue text.
Assessment
- Domain
- cli, desktop
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 20/100