UNPKG

scadr

Version:

Render multi-part OpenSCAD files to STL

194 lines (135 loc) 5.36 kB
# scadr Quickly render multiple high-quality `.stl` files from a single OpenSCAD source ## Introduction OpenSCAD files can contain many self-contained subparts, typically modelled with the `module` construct: ```scad // demo.scad file contents // Top-level renderings ball(); translate([10, 0, 0]) box(); // Subparts module ball() { sphere(d = 5); } module box() { cube([5, 5, 5], center = true); } ``` Directly exporting this from OpenSCAD can be annoying. Since the entire scene is included in a single `.stl` file, you usually need separate software to split these apart before they can be printed. It's awkward to switch back and forth between commenting out various parts of your project -- ideally, you can design with the entire scene in view, then render out separate files and print them individually. You might also want to iterate quickly on a design by looking at a low-poly render of it, but obviously want to print at a very high quality that can take a long time to render. `scadr` solves both these problems. ### File Splitting For example, let's say you want to render two shapes from the same file (maybe they actually depend on common parameters, for example). If you run `scadr` on the demo file above, it'll automatically produce two outputs: `demo-ball.stl` and `demo-box.stl`: ``` > scadr demo.scad Rendering ball to demo-ball.stl... Rendering box to demo-box.stl... Done! ``` Complex models might also have many sub-modules, only some of which you want to produce `.stl` files from. `scadr` supports multiple ways of doing this. For a zero-config solution, apply a naming convention to the modules you want exports of. Multiple conventions are supported to indicate which modules should be exported: * Use `Pascal` casing, e.g. `MyBox` *or* * Use leading underscores, e.g. `_myBox` The naming convention will be detected automatically. You can also pass a list of modules on the commandline: ``` scadr demo.scad --module ball --module box ``` ### Development vs Production Quality Another common issue is wanting fast iteration while designing an object, while producing `.stl` files with the highest necessary resolution. You can pass commandline arguments to `scadr` to change resolution, just like in OpenSCAD: ``` > scadr demo.scad -d $fn=180 ``` For a zero-config solution, put high-quality values at the top level of a file, and override those with lower-quality values in a previewing module: ```scad // High-quality default $fn = 180; preview(); module preview() { // use low-quality rendering for development purposes $fn = undef; $fa = 15; $fs = 1; ball(); translate([10, 0, 0]) box(); } ``` ## Installation ### Prerequisites [node.js](https://nodejs.org/en) ### Installing ```shell npm install -g scadr ``` ## Usage & Setup ### Syntax ```shell scadr [options] path ``` ### Basic Example ```shell scadr my-file.scad ``` Renders the top-level modules of `my-file.scad` to individual `.stl` files. For example, if `my-file.scad` contained ```scad module ball() { sphere(r = 3); } module box() { cube([5, 5, 5]); } ``` then the files `my-file-ball.stl` and `my-file-box.stl` would be produced. ## Options ``` Usage: scadr [options] <path> Arguments: path .scad file to render Options: -d, --define <value> variable definitions (default: []) -m, --module <name> specific module to render (default: []) -c, --convention <kind> top-level naming convention (choices: "auto", "pascal", "all", "underscore", default: "auto") -l, --list list modules without rendering --dry dry run (show what would happen) -h, --help display help for command ``` ### `--define n=v` ```shell scadr my-file.scad --define $fn=180 --define qual="high" ``` Defines a variable. Multiple definitions can be provided. ### `--module name` Defines a module that should be rendered. Multiple modules can be provided ```shell scadr demo.scad --module Alpha --module Beta ``` If no modules are provided, the list of modules to render is determined by `convention` (see below). ### `--convention` You can automatically filter which top-level modules are rendered by using a naming convention. Supported conventions are: * `all`: Render every top-level module * `pascal`: Render `Alpha`, but not `alpha` * `underscore`: Render `_part1`, but not `part1` * `auto`: Infer the naming convention of the file `auto` chooses `pascal` if some (but not all) modules are `Pascal`-cased, otherwise chooses `underscore` if some (but not all) modules are named with an initial `_`, otherwise renders everything (`all`) ### `--list` Prints out which modules in this file would be rendered (as determined by `convention`). ### `--dry` Prints out what would happen, but doesn't actually do it ## Troubleshooting ### Error "Unable to find OpenSCAD" > Unable to find OpenSCAD; set OPENSCADPATH environment variable `scadr` tries to automatically find where OpenSCAD's executable is located. If this process fails, please [log a bug](https://github.com/SeaRyanC/scadr/issues/new) describing your system configuration (operating system and the actual location of OpenSCAD). To workaround, set the `OPENSCADPATH` environment variable to the OpenSCAD entry point file. ## Changelog #### 0.1.0 First release