-
Notifications
You must be signed in to change notification settings - Fork 0
/
primitives.stanza
67 lines (52 loc) · 3.71 KB
/
primitives.stanza
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
defpackage primitives :
import core
import collections
import math
import geom
import clipper
import font
import libfive
import utilities
public defn trapezoid (base1:Float, base2:Float, height:Float) -> Polygon:
var point1 = V2f(-1.0f * base1 / 2.0f ,-1.0f * height / 2.0f)
var point2 = V2f(base1 / 2.0f, -1.0f * height / 2.0f)
var point3 = V2f(base2 / 2.0f, height / 2.0f)
var point4 = V2f(-1.0f * base2 / 2.0f, height / 2.0f)
Polygon([Contour([point1, point2, point3, point4])])
;;perpindicular joint
public defn dovetail_dado_primitive (width:Float, length:Float, wood_thickness:Float) -> [Shape, Tuple<Shape>]:
var slice_in = tenon(V3f(width, length / 6.0f, wood_thickness))
var neck = extrude(wood_thickness / 2.0f ,to-shape(trapezoid(width / 4.0f, width / 2.0f ,length / 2.0f)))
var hat = tenon(V3f(width * 2.0f / 3.0f, width / 3.0f, wood_thickness / 2.0f))
neck = union(attach(slice_in, connection_point(bounds(slice_in), V3f(0.5f, 1.0f, 1.0f)), neck, connection_point(bounds(neck), V3f(0.5f, 0.0f, 1.0f))))
val pin_location = mov(connection_point(bounds(neck), V3f(0.5f, 0.5f, 0.5f)), pin_primitive(width / 8.0f, wood_thickness))
val joint = union(attach(hat, connection_point(bounds(hat), V3f(0.5f, 0.0f, 1.0f)), neck, connection_point(bounds(neck), V3f(0.5f, 1.0f, 1.0f))))
[mov-z(0.5f,joint), [mov-z(0.5f,pin_location)]]
;; corner joint
public defn dovetail_blind_primitive (width:Float, length:Float, wood_thickness:Float) -> [Shape, Tuple<Shape>]:
var face = trapezoid(width / 2.0f, width, length)
var joint = extrude(length, to-shape(face))
var pin_location = mov(connection_point(bounds(joint), V3f(0.5f, 0.5f, 0.5f)), pin_primitive(length / 8.0f, wood_thickness))
[rot-z(90.0f, rot-y(90.0f, joint)), [pin_location]]
;; parallel joint
public defn gooseneck_primitive (width:Float, length:Float, wood_thickness:Float) -> [Shape, Tuple<Shape>] :
var left_tenon = tenon(V3f(width / 3.0f, width / 6.0f, wood_thickness / 2.0f))
var right_tenon = tenon(V3f(width / 3.0f, width / 6.0f, wood_thickness / 2.0f))
var middle_tenon = tenon(V3f(width / 3.0f, width / 6.0f, wood_thickness / 2.0f))
var neck = extrude(wood_thickness / 2.0f, to-shape(polygon-rect(V2f(width / 3.0f, length * 0.75f))))
var lower_pin_location = mov(connection_point(bounds(neck), V3f(0.5f, 0.33f, 0.5f)), pin_primitive(width / 8.0f, wood_thickness))
var upper_pin_location = mov(connection_point(bounds(neck), V3f(0.5f, 0.67f, 0.5f)), pin_primitive(width / 8.0f, wood_thickness))
neck = union(attach(left_tenon, connection_point(bounds(left_tenon), V3f(1.0f, 0.0f, 0.5f)), neck, connection_point(bounds(neck), V3f(0.0f, 0.0f, 0.5f))))
neck = union(attach(right_tenon, connection_point(bounds(right_tenon), V3f(0.0f, 0.0f, 0.5f)), neck, connection_point(bounds(neck), V3f(1.0f, 0.0f, 0.5f))))
var tapering_slope = wood_thickness / 10.0f
var head_top = trapezoid(width / 2.0f, width / 4.0f, length * 0.25f)
var head_bottom = trapezoid(width / 2.0f - tapering_slope, width / 4.0f - tapering_slope, length * 0.25f)
var head = loft(wood_thickness / 2.0f, to-shape(head_bottom), to-shape(head_top))
var joint = union(attach(head, connection_point(bounds(head), V3f(0.5f, 0.0f, 0.5f)), neck, connection_point(bounds(neck), V3f(0.5f, 1.0f, 0.5f))))
joint = union(attach(middle_tenon, connection_point(bounds(middle_tenon), V3f(0.5f, 0.0f, 1.0f)), joint, connection_point(bounds(joint), V3f(0.5f, 0.0f, 0.0f))))
[mov-z(0.5f, joint), [lower_pin_location, upper_pin_location]]
public defn pin_primitive (pin_width:Float, wood_thickness:Float) :
extrude(wood_thickness, square(pin_width))
public defn tenon (dimensions:V3f) -> Shape:
var tenon = to-shape(polygon-rect(V2f(x(dimensions), y(dimensions))))
extrude(z(dimensions), tenon)