diff options
| -rw-r--r-- | openscad.html.markdown | 117 | 
1 files changed, 117 insertions, 0 deletions
| diff --git a/openscad.html.markdown b/openscad.html.markdown new file mode 100644 index 00000000..e09b5109 --- /dev/null +++ b/openscad.html.markdown @@ -0,0 +1,117 @@ +--- +language: openscad +filename: learnopenscad.scad +contributors: +    - ["Tom Preston", "https://github.com/tompreston/"] +--- + +Draw 3D models with code using [OpenSCAD](https://openscad.org/). + +```openscad +// Comments look like this + +// 3D Primitives +cube(10); +cube([5, 10, 20]); +sphere(10); + +// Transformations +translate([20, 0, 0]) cube(10); +rotate([0, 20, 30]) cube(10); + +translate([20, 0, 0]) rotate([0, 20, 30]) cube(10); +rotate([0, 20, 30]) translate([20, 0, 0]) cube(10); + +// Modifiers +// +//     * disable +//     ! show only +//     # highlight / debug +//     % transparent / background +// +// For example, show only the rotated cube at the origin, before we translate it. +translate([20, 0, 0]) !rotate([0, 20, 30]) cube(10); + +// Formatting +// The following models are the same. The official docs prefer the second. +rotate([0, 20, 30]) translate([20, 0, 0]) cube(10); + +rotate([0, 20, 30]) +    translate([20, 0, 0]) +    cube(10); + +rotate([0, 20, 30]) { +    translate([20, 0, 0]) { +        cube(10); +    } +} + +// Loops +num_cubes = 5; +r = 20; +cube_len = 5; + +for (i = [0:num_cubes]) { +    echo(str("Plot cube ", i)); +    rotate([0, i * 360 / num_cubes, 0]) +        translate([r, 0, 0]) +        cube(cube_len, center=true); +} + +// Boolean operations +// +//            union() - the sum of both shapes +//       difference() - the first shape, minus the second shape +//     intersection() - only parts of both shapes which intersect +// +cube_l = 20; +cube_w = 10; +cube_h = 10; + +hole_pos_l = 10; +hole_pos_h = 5; +hole_r = 3; + +difference() { +    cube([cube_l, cube_w, cube_h]); +    translate([hole_pos_l, 0, hole_pos_h]) +        rotate([-90, 0, 0]) +        cylinder(cube_w, r=hole_r); +} + +// Functions calculate values +function inch2mm(i) = i * 25.4; + +cube(inch2mm(2)); + +// Modules create objects you want to use later +module house(roof="flat", paint=[1,0,0]) { +    color(paint) +    if (roof=="flat") { +        translate([0,-1,0]) cube(); +    } else if (roof=="pitched") { +        rotate([90,0,0]) +            linear_extrude(height=1) +            polygon(points=[[0,0],[0,1],[0.5,1.5],[1,1],[1,0]]); +    } +    else if (roof=="domical") { +        translate([0,-1,0]) { +            translate([0.5,0.5,1]) +                sphere(r=0.5,$fn=20); +            cube(); +        } +    } +} + +house("pitched"); +translate([2, 0, 0]) house("domical"); + +// Import modules and function from other files +include <filename> // Import the content of the file as if they were written in this file +use <filename>     // Import modules and functions, but do not execute any commands +``` + +## Further Reading +* Official docs https://openscad.org/documentation.html +* Cheat sheet https://openscad.org/cheatsheet/index.html +* Vim bindings https://github.com/sirtaj/vim-openscad | 
