Skip to content

Support for variables, scripting support #2

Description

@gingerbeardman

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();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
      Skip to content

      Support for variables, scripting support #2

      Description

      @gingerbeardman

      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();
      }
      

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
          Skip to content

          Support for variables, scripting support #2

          Description

          @gingerbeardman

          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();
          }
          

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
              Skip to content

              Support for variables, scripting support #2

              Description

              @gingerbeardman

              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();
              }
              

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
                  Skip to content

                  Support for variables, scripting support #2

                  Description

                  @gingerbeardman

                  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();
                  }
                  

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
                      Skip to content

                      Support for variables, scripting support #2

                      Description

                      @gingerbeardman

                      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();
                      }
                      

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
                          Skip to content

                          Support for variables, scripting support #2

                          Description

                          @gingerbeardman

                          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();
                          }
                          

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Support for variables, scripting support · Issue #2 · nicklockwood/ShapeScript · GitHub
                              Skip to content

                              Support for variables, scripting support #2

                              Description

                              @gingerbeardman

                              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();
                              }
                              

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions