107 lines
3.4 KiB
Plaintext
107 lines
3.4 KiB
Plaintext
![]() |
// Teapot
|
||
|
// A vessel with a spout and a handle used for serving tea and boiling water on a stovetop
|
||
|
|
||
|
// Set units
|
||
|
@settings(defaultLengthUnit = mm)
|
||
|
|
||
|
// Define parameters
|
||
|
teapotHeight = 130
|
||
|
beltlineDiameter = 160
|
||
|
wallThickness = 6
|
||
|
outletHeight = 26
|
||
|
spoutDiameter = 12
|
||
|
|
||
|
// Sketch the path of the teapot spout
|
||
|
spoutPath = startSketchOn(XZ)
|
||
|
|> startProfile(at = [-beltlineDiameter / 2.5, outletHeight])
|
||
|
|> xLine(length = -15.05)
|
||
|
|> tangentialArc(angle = -110, radius = 30, tag = $seg01)
|
||
|
|> angledLine(angle = tangentToEnd(seg01), length = 16.84)
|
||
|
|> tangentialArc(angle = 100, radius = 30)
|
||
|
|
||
|
// Sweep a hollow spout
|
||
|
spout = startSketchOn(offsetPlane(YZ, offset = -beltlineDiameter / 2.5))
|
||
|
|> circle(center = [0, outletHeight], diameter = spoutDiameter)
|
||
|
|> subtract2d(tool = circle(center = [0, outletHeight], diameter = spoutDiameter * 0.8))
|
||
|
|> sweep(path = spoutPath)
|
||
|
|
||
|
// Model the perimeter of the teapot body, to be used to trim the handle so that it fits snug to the body
|
||
|
tools = startSketchOn(YZ)
|
||
|
|> startProfile(at = [0, 0])
|
||
|
|> xLine(length = beltlineDiameter / 5)
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 2.1,
|
||
|
teapotHeight / 2.5
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 3,
|
||
|
teapotHeight / 1.1
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [beltlineDiameter / 4, teapotHeight])
|
||
|
|> xLine(endAbsolute = profileStartX(%))
|
||
|
|> line(endAbsolute = profileStart(%))
|
||
|
|> close()
|
||
|
|> revolve(axis = Y)
|
||
|
|
||
|
// Sketch the path of the handle
|
||
|
handlePath = startSketchOn(XZ)
|
||
|
|> startProfile(at = [0, outletHeight])
|
||
|
|> xLine(endAbsolute = 76)
|
||
|
|> tangentialArc(end = [12.98, 6.64])
|
||
|
|> tangentialArc(end = [28.39, 63.11])
|
||
|
|> tangentialArc(end = [-10.27, 14.8])
|
||
|
|> tangentialArc(end = [-48.01, 1.81], tag = $seg02)
|
||
|
|> angledLine(angle = tangentToEnd(seg02), endAbsoluteX = 0)
|
||
|
|
||
|
// Sweep the handle
|
||
|
handle = startSketchOn(YZ)
|
||
|
|> startProfile(at = [-10, outletHeight + 3.5])
|
||
|
|> arc(interiorAbsolute = [0, outletHeight + 5], endAbsolute = [10, profileStartY(%)])
|
||
|
|> tangentialArc(end = [0, -7])
|
||
|
|> tangentialArc(end = [-20, 0])
|
||
|
|> tangentialArc(endAbsolute = profileStart())
|
||
|
|> close()
|
||
|
|> sweep(path = handlePath)
|
||
|
|> subtract(tools)
|
||
|
|
||
|
// Create a cutout in the body for the spout outlet
|
||
|
spoutHole = startSketchOn(YZ)
|
||
|
|> circle(center = [0, outletHeight], diameter = spoutDiameter)
|
||
|
|> extrude(length = -beltlineDiameter / 2)
|
||
|
|
||
|
// Model the body of the teapot
|
||
|
body = startSketchOn(YZ)
|
||
|
|> startProfile(at = [0, 0])
|
||
|
|> xLine(length = beltlineDiameter / 5)
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 2.1,
|
||
|
teapotHeight / 2.5
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 3,
|
||
|
teapotHeight / 1.1
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [beltlineDiameter / 4, teapotHeight])
|
||
|
|> tangentialArc(angle = 190, diameter = wallThickness)
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 3 - wallThickness,
|
||
|
teapotHeight / 1.1
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 2.1 - wallThickness,
|
||
|
teapotHeight / 2.5
|
||
|
])
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
beltlineDiameter / 5,
|
||
|
profileStartY() + wallThickness
|
||
|
])
|
||
|
|> xLine(endAbsolute = profileStartX(%))
|
||
|
|> line(endAbsolute = profileStart(%))
|
||
|
|> close()
|
||
|
|> revolve(axis = Y)
|
||
|
|> subtract(tools = [spoutHole])
|
||
|
|
||
|
// Join each component of the teapot and add an appearance
|
||
|
[body, handle, spout]
|
||
|
|> appearance(color = "#1f9896", metalness = 40, roughness = 30)
|