nicklockwood / nicklockwood/ShapeScript

Support for variables, scripting support

Open
#2 4 comments 0 reactions 0 assignees View on GitHub

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:

  • $t to 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):

forklift-table-38-38

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.