dotSCAD 3.3
Reduce the burden of mathematics/algorithm when playing OpenSCAD.
![dotSCAD](https://github.com/JustinSDK/dotSCAD/raw/master/featured_img/Owls.JPG)
Introduction
Some of my 3D models require complex mathematics/algorithm. I extract them into dotSCAD. Hope it helps when you're playing OpenSCAD.
The idea of the name dotSCAD comes from the filename extension ".scad" of OpenSCAD.
Getting started
OpenSCAD uses three library locations, the installation library, built-in library, and user defined libraries. Check Setting OPENSCADPATH in OpenSCAD User Manual/Libraries for details.
I set OPENSCADPATH
to the src
folder of dotSCAD so all examples here start searching modules/functions from src
.
Every public module/function has the same name as the .scad file. Here's an example using the line2d
module:
use <line2d.scad>
line2d(p1 = [0, 0], p2 = [5, 0], width = 1);
The library uses directories to categorize some modules/functions. For example, vx_circle.scad exists in voxel
directory. Prefix the directory name when using vx_circle
.
use <voxel/vx_circle.scad>
points = vx_circle(radius = 10);
for(pt = points) {
translate(pt) square(1);
}
Examples
These examples incubate dotSCAD and dotSCAD refactors these examples. See examples.
![examples](https://github.com/JustinSDK/dotSCAD/raw/master/examples/images/gallery.JPG)
API Reference
2D Module
Signature |
Description |
arc(radius, angle[, width, width_mode"]) |
create an arc. |
hexagons(radius, spacing, levels) |
create hexagons in a hexagon. |
line2d(p1, p2[, width, p1Style, p2Style]) |
create a line from two points. |
multi_line_text(lines[, line_spacing, size, font, ...]) |
create multi-line text from a list of strings. |
pie(radius, angle) |
create polyline2de a pie (circular sector). |
polyline2d(points[, width, startingStyle, endingStyle, ...]) |
create a polyline from a list of [x, y] coordinates. |
polygon_hull(points) |
create a convex polygon by hulling a list of points. It avoids using hull and small 2D primitives to create the polygon. |
rounded_square(size, corner_r[, center]) |
create a rounded square in the first quadrant. |
3D Module
Signature |
Description |
crystal_ball(radius[, theta, phi, thickness]) |
create a crystal ball based on spherical coordinates (r, θ, φ) used in mathematics. |
line3d(p1, p2[, diameter, p1Style, p2Style]) |
create a 3D line from two points. |
loft(sections[, slices]) |
develop a smooth skin between crosssections with different geometries. |
polyhedron_hull(points) |
create a convex polyhedron by hulling a list of points. It avoids using hull and small 3D primitives to create the polyhedron. |
polyline3d(points, diameter[, startingStyle, endingStyle]) |
create a polyline from a list of [x, y, z] . |
rounded_cube(size, corner_r[, center]) |
create a cube in the first octant. |
rounded_cylinder(radius, h, round_r[, convexity, center]) |
create a rounded cylinder. |
sweep(sections[, triangles]) |
develop a smooth skin from crosssections with the same number of sides. |
Transformation
Signature |
Description |
along_with(points, angles[, twist, scale, method]) |
put children along the given path. If there's only one child, put the child for each point. |
bend(size, angle[, frags]) |
bend a 3D object. |
hollow_out(shell_thickness) |
hollow out a 2D object. |
shear([sx, sy, sz]) |
shear all child elements along the X-axis, Y-axis, or Z-axis. |
select(i) |
select module objects. |
polyline_join(points) |
place a join on each point. Hull each pair of joins and union all convex hulls. |
2D Function
2D/3D Function
Signature |
Description |
angle_between(vt1, vt2) |
return the angle between two vectors. |
bezier_smooth(path_pts, round_d[, t_step, closed, angle_threshold]) |
use bezier curves to smooth a path. |
cross_sections(shape_pts, path_pts, angles[, twist, scale]) |
given a 2D shape, points and angles along the path, this function returns all cross-sections. |
in_polyline(line_pts, pt[, epsilon]) |
check whether a point is on a line. |
lines_intersection(line1, line2[, ext, epsilon]) |
find the intersection of two line segments. Return [] if lines don't intersect. |
path_scaling_sections(shape_pts, edge_path) |
given an edge path with the first point at the outline of a shape, this function uses the path to calculate scaling factors and returns all scaled sections in the reversed order of the edge path. |
midpt_smooth(points, n[, closed]) |
given a 2D path, this function constructs a mid-point smoothed version by joining the mid-points of the lines of the path. |
Path
Signature |
Description |
arc_path(radius, angle) |
create an arc path. |
archimedean_spiral(arm_distance, init_angle, point_distance, num_of_points[, rt_dir]) |
get all points and angles on the path of an archimedean spiral. |
bauer_spiral(n, radius = 1[, rt_dir]) |
create visually even spacing of n points on the surface of the sphere. Successive points will all be approximately the same distance apart. |
bezier_curve(t_step, points) |
given a set of control points, this function returns points of the Bézier path. |
bspline_curve(t_step, degree, points, knots, weights) |
B-spline interpolation using de Boor's algorithm. |
curve(t_step, points[, tightness]) |
create a curved path. An implementation of Centripetal Catmull-Rom spline. |
fibonacci_lattice(n, radius = 1[, dir]) |
create visually even spacing of n points on the surface of the sphere. Nearest-neighbor points will all be approximately the same distance apart. |
golden_spiral(from, to, point_distance[, rt_dir)] |
get all points and angles on the path of a golden spiral based on Fibonacci numbers. The distance between two points is almost constant. |
helix(radius, levels, level_dist[, vt_dir, rt_dir]) |
get all points on the path of a spiral around a cylinder. |
sphere_spiral(radius, za_step[, z_circles, begin_angle, end_angle, ...]) |
create all points and angles on the path of a spiral around a sphere. It returns a vector of [[x, y, z], [ax, ay, az]] . |
torus_knot(p, q, phi_step) |
generate a path of The (p,q)-torus knot. |
Extrusion
Signature |
Description |
bend_extrude(size, thickness, angle[, frags]) |
extrude and bend a 2D shape. |
box_extrude(height, shell_thickness, bottom_thickness[, offset_mode, chamfer, ...]) |
create a box (container) from a 2D object. |
ellipse_extrude(semi_minor_axis, height[, center, convexity, twist, slices]) |
extrude a 2D object along the path of an ellipse from 0 to 180 degrees. |
rounded_extrude(size, round_r[, angle, twist, convexity]) |
extrude a 2D object roundly from 0 to 180 degrees. |
stereographic_extrude(shadow_side_leng) |
take a 2D polygon as input and extend it onto a sphere. |
2D Shape
Signature |
Description |
shape_arc(radius, angle, width[, width_mode]) |
return points on the path of an arc shape. |
shape_circle(radius, n) |
return points on the path of a circle. |
shape_cyclicpolygon(sides, circle_r, corner_r) |
return points on the path of a regular cyclic polygon. |
shape_ellipse(axes) |
return points on the path of an ellipse. |
shape_liquid_splitting(radius, centre_dist[, tangent_angle, t_step]) |
return shape points of two splitting liquid shapes, kind of how cells divide. |
shape_path_extend(stroke_pts, path_pts[, scale, closed]) |
extend a 2D stroke along a path to create a 2D shape. |
shape_pentagram(r) |
return shape points of a pentagram. |
shape_pie(radius, angle) |
return shape points of a pie (circular sector) shape. |
shape_square(size[, corner_r]) |
return shape points of a rounded square or rectangle. |
shape_star([outer_radius, inner_radius, n]) |
create a 2D star. |
shape_superformula(phi_step, m1, m2, n1, [n2, n3, a, b]) |
return shape points of Superformula. |
shape_taiwan(h[, distance]) |
return shape points of Taiwan. |
shape_trapezium(length, h[, corner_r]) |
return shape points of an isosceles trapezoid. |
2D Shape Extrusion
Signature |
Description |
archimedean_spiral_extrude(shape_pts, arm_distance, init_angle, point_distance, num_of_points, ...) |
extrude a 2D shape along the path of an archimedean spiral. |
golden_spiral_extrude(shape_pts, from, to, point_distance, ...) |
extrude a 2D shape along the path of a golden spiral. |
helix_extrude(shape_pts, radius, levels, level_dist, ...) |
extrude a 2D shape along a helix path. |
path_extrude(shape_pts, path_pts, ...) |
extrude a 2D shape along a path. |
ring_extrude(shape_pts, radius[, angle = 360]) |
rotational extrusion spins a 2D shape around the Z-axis. |
sphere_spiral_extrude(shape_pts, radius, za_step, ...) |
extrude a 2D shape along the path of a sphere spiral. |
Util
util/list
Signature |
Description |
util/binary_search(sorted, target[, lo, hi]) |
search a value in a sorted list. |
util/contains(lt, elem) |
return true if lt contains elem . |
util/find_index(lt, test) |
return the index of the first element that satisfies the testing function. |
util/dedup(lt, ...) |
eliminate duplicate vectors. |
util/flat(lt[, depth]) |
return a new list with all sub-list elements concatenated into it recursively up to the specified depth. |
util/reverse(lt) |
reverse a list. |
util/slice(lt, begin, end) |
return a list selected from begin to end , or to the end of the list (end not included). |
util/sorted(lt[, cmp, key, reverse]) |
sort a list. |
util/sum(lt) |
use + to sum up all elements in a list. |
util/swap(lt, i, j) |
swap two elements in a list. |
util/zip(lts, combine) |
make a list that aggregates elements from each of the lists. |
util/every(lt, test) |
test whether all elements in the list pass the test implemented by the provided function. |
util/some(lt, test) |
test whether at least one element in the list passes the test implemented by the provided function. |
util/count(lt, test) |
return the number of times test return true in the list. |
util/random
util/string
util/math
util/set
util/map
Matrix
Signature |
Description |
matrix/m_determinant(m) |
calculate a determinant of a square matrix. |
matrix/m_mirror(v) |
generate a transformation matrix which can pass into multmatrix to mirror the child element on a plane through the origin. |
matrix/m_rotation(a, v) |
Generate a transformation matrix which can pass into multmatrix to rotate the child element about the axis of the coordinate system or around an arbitrary axis. |
matrix/m_scaling(s) |
generate a transformation matrix which can pass into multmatrix to scale its child elements using the specified vector. |
matrix/m_shearing([sx, sy, sz]) |
generate a transformation matrix which can pass into multmatrix to shear all child elements along the X-axis, Y-axis, or Z-axis in 3D. |
matrix/m_translation(v) |
generate a transformation matrix which can pass into multmatrix to translates (moves) its child elements along the specified vector. |
maxtrix/m_transpose(m) |
transpose a matrix. |
matrix/m_replace(m, i, j, value) |
replace the aᵢⱼ element of a matrix. |
Point Transformation
Signature |
Description |
ptf/ptf_bend(size, point, radius, angle) |
transform a point inside a rectangle to a point of an arc. |
ptf/ptf_circle(size, point) |
transform a point inside a rectangle to a point inside a circle. |
ptf/ptf_ring(size, point, radius[, angle, twist]) |
transform a point inside a rectangle to a point of a ring. |
ptf/ptf_rotate(point, a, v) |
rotate a point a degrees around the axis of the coordinate system or an arbitrary axis. |
ptf/ptf_sphere(size, point, radius[, angle]) |
transform a point inside a rectangle to a point of a sphere. |
ptf/ptf_torus(size, point, radius[, angle, twist]) |
transform a point inside a rectangle to a point of a torus. |
ptf/ptf_x_twist(size, point, angle) |
twist a point along the x-axis. |
ptf/ptf_y_twist(size, point, angle) |
twist a point along the y-axis. |
Triangle
Turtle
Signature |
Description |
turtle/footprints2(cmds[, start]) |
drive a turtle with ["forward", length] or ["turn", angle] . This function is intended to use a turtle to imitate freehand drawing. |
turtle/footprints3(cmds[, start]) |
a 3D verion of footprint2 . |
turtle/lsystem2(axiom, rules, n, angle[, leng, heading, ...]) |
2D implementation of L-system. |
turtle/lsystem3(axiom, rules, n, angle[, leng, heading, ...]) |
3D implementation of L-system. |
turtle/t2d(t, cmd, point, angle, leng) |
an implementation of Turtle Graphics. |
turtle/t3d(t, cmd, point, unit_vectors, leng, angle) |
a 3D version of t2d . |
Voxel
Signature |
Description |
voxel/vx_ascii(char[, center, invert]) |
generate 8x8 voxel points of printable ASCII characters (codes 32dec to 126dec). |
voxel/vx_bezier(p1, p2, p3, p4) |
return voxel-by-voxel points of Bézier Curve. |
voxel/vx_circle(radius[, filled]) |
return points that can be used to draw a voxel-style circle. |
voxel/vx_contour(points[, sorted]) |
return the contour which encircles the area. |
voxel/vx_curve(points[, tightness]) |
the curve is drawn only from the 2nd control point to the second-last control point. |
voxel/vx_cylinder(r, h[, filled, thickness]) |
return points that can be used to draw a voxel-style cylinder. |
voxel/vx_difference(points1, points2) |
create a difference of two lists of points. |
voxel/vx_from(binaries[, center, invert]) |
given a list of 0s and 1s that represent a black-and-white image. This function translates them into voxel points. |
voxel/vx_gray(levels[, center, invert, normalize]) |
given a list of numbers (0 ~ 255) that represent a gray image. This function translates them into a list of [x, y, level] s. |
voxel/vx_intersection(points1, points2) |
create an intersection of two lists of points. |
voxel/vx_line(p1, p2) |
given two points. it returns points that can be used to draw a voxel-style line. |
voxel/vx_polygon(points[, filled]) |
return points that can be used to draw a voxel-style polygon. |
voxel/vx_polyline(points) |
return points that can be used to draw a voxel-style polyline. |
voxel/vx_sphere(radius[, filled, thickness]) |
return points that can be used to draw a voxel-style sphere. |
voxel/vx_union(points1, points2) |
create a union of two lists of points. |
Part
Signature |
Description |
part/cone(radius[, length, spacing, angle, void, ends]) |
create a cone for rotatable models. |
part/connector_peg(radius, height[, spacing, void, ends]) |
create a connector peg. |
part/joint_T(shaft_r, shaft_h, t_leng, thickness,[ spacing, center]) |
create a joint_T for rotatable models. |
Surface
Signature |
Description |
surface/sf_bend(levels, radius, thickness, depth[, angle, invert]) |
bend a photo. |
surface/sf_ring(levels, radius, thickness, depth[, angle, twist, invert]) |
turn a photo into a ring. |
surface/sf_solidify(surface1, surface2[, slicing]) |
solidify two square surfaces. |
surface/sf_sphere(levels, radius, thickness, depth[, angle, invert)] |
map a photo onto a sphere. |
surface/sf_square(levels, thickness, depth[, x_twist, y_twist, invert]) |
turn a photo into a twistable square. |
surface/sf_torus(levels, radius, thickness, depth[, angle, twist, invert]) |
turn a photo to a torus. |
surface/sf_curve(levels, curve_path, ...) |
curve a photo. |
surface/sf_splines(ctrl_pts, row_spline, column_spline) |
generalized-spline surface. |
surface/sf_thicken(points, thickness, ...) |
thicken a surface. |
surface/sf_solidifyT(points1, points2, triangles) |
solidify two surfaces with triangular mesh. |
surface/sf_thickenT(points, thickness, ...) |
thicken a surface with triangular mesh. |
Noise
Signature |
Description |
noise/nz_cell(points, p[, dist]) |
an implementation of Worley noise. |
noise/nz_perlin1(x[, seed]) |
return the 1D Perlin noise value at the x coordinate. |
noise/nz_perlin1s(xs[, seed]) |
return 1D Perlin noise values at x coordinates. |
noise/nz_perlin2(x, y[, seed]) |
return the 2D Perlin noise value at the (x, y) coordinate. |
noise/nz_perlin2s(points[, seed]) |
return 2D Perlin noise values at (x, y) coordinates. |
noise/nz_perlin3(x, y, z[, seed]) |
return the 3D Perlin noise value at the (x, y, z) coordinate. |
noise/nz_perlin3s(points[, seed]) |
return 3D Perlin noise values at (x, y, z) coordinates. |
noise/nz_worley2(x, y[, seed, grid_w, dist]) |
return the 2D Worley noise value at the (x, y) coordinate. |
noise/nz_worley2s(points[, seed, grid_w, dist]) |
return 2D Worley noise values at (x, y) coordinates. |
noise/nz_worley3(x, y, z[, seed, grid_w, dist]) |
return the 3D Worley noise value at the (x, y, z) coordinate. |
noise/nz_worley3s(points[, seed, grid_w, dist]) |
return 3D Worley noise values at (x, y, z) coordinates. |
Voronoi
Signature |
Description |
voronoi/vrn2_cells_from(points) |
create cell shapes of Voronoi from a list of points. |
voronoi/vrn2_cells_space(size, grid_w[, seed]) |
create cell shapes of Voronoi in the first quadrant. |
voronoi/vrn2_from(points[, spacing, ...]) |
create a Voronoi from a list of points. |
voronoi/vrn2_space(size, grid_w[, seed, spacing, ...]) |
create a Voronoi in the first quadrant. |
voronoi/vrn3_from(points[, spacing]) |
create a 3D version of Voronoi. |
voronoi/vrn3_space(size, grid_w[, seed, spacing]) |
create a Voronoi in the first octant. |
Maze
Signature |
Description |
maze/mz_square([rows, columns, start, init_cells, x_wrapping, y_wrapping, seed]) |
return cell data of a square maze. |
maze/mz_square_get(cell, query) |
a helper for getting data from a square-maze cell. |
maze/mz_squarewalls(cells, cell_width[, left_border, bottom_border]) |
a helper for creating square wall data from maze cells. |
maze/mz_hexwalls(cells, cell_radius[, left_border, bottom_border]) |
a helper for creating hex wall data from maze cells. |
maze/mz_square_initialize(rows, columns, mask) |
a helper for initializing cell data of a maze. |
maze/mz_hamiltonian(rows, columns[, start, seed]) |
create a hamiltonian path from a maze. |
maze/mz_theta_cells(rows, beginning_number[, start, seed]) |
return cell data of a theta maze. |
maze/mz_theta(rings, beginning_number[, start, seed]) |
return cell data of a theta maze. |
maze/mz_tiles(cells[, left_border, bottom_border]) |
turn maze cells into tiles. |
Polyhedra
Signature |
Description |
polyhedra/star([outerRadius, innerRadius, height, n]) |
create a 3D star. |
polyhedra/polar_zonohedra(n[, theta]) |
create a polar zonohedra. |
polyhedra/tetrahedron(radius[, detail]) |
create a tetrahedron. |
polyhedra/hexahedron(radius[, detail]) |
create a hexahedron. |
polyhedra/octahedron(radius[, detail]) |
create a octahedron. |
polyhedra/dodecahedron(radius[, detail]) |
create a dodecahedron. |
polyhedra/icosahedron(radius[, detail]) |
create a icosahedron. |
polyhedra/superellipsoid(radius[, detail]) |
create a superellipsoid. |
Point Picking
Signature |
Description |
pp/pp_disk(radius, value_count[, seed]) |
generate random points over a disk. |
pp/pp_sphere(radius, value_count[, seed]) |
pick random points on the surface of a sphere. |
pp/pp_poisson2(size, r[, start, k, seed]) |
perform poisson sampling over a rectangle area. |
pp/pp_poisson3(size, r[, start, k, seed]) |
perform poisson sampling over a cube space. |