diff --git a/openscad.html.markdown b/openscad.html.markdown new file mode 100644 index 00000000..b2f46562 --- /dev/null +++ b/openscad.html.markdown @@ -0,0 +1,120 @@ +--- +language: openscad +filename: leanopenscad.scad +contributors: + - ["Thomas Preston", "https://github.com/tompreston/"] +--- + +Draw 3D models with code using [OpenSCAD](https://openscad.org/). + +```openscad +// Single-line comments start with // + +/* +Multi-line 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 /* Import the content of the file as if they were written in this file. */ +use /* 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