Honeycomb Vase
A bulging vase wrapped in a honeycomb pattern, for a single stem or dried flowers. The outline is a single formula r(z), and the width of each honeycomb row is computed from the same formula, so the cells widen where the body swells and narrow toward the neck. The pattern is engraved 1.2 mm deep instead of cut through, so the vase can hold water. It measures 100 x 100 x 180 mm. Print it upright with no supports; the hexagons have pointed tops, so the pockets have 60 degree roofs instead of flat overhangs (no spiral vase mode). You can change the height, base radius, bulge amplitude, wall and bottom thickness, cell count per ring, number of rows, row pitch, engraving depth and rib width.
# Honeycomb Vase - curved vase with a honeycomb pattern that follows its surface
# The outline is defined by the formula r(z), and the honeycomb cell width is computed from the same formula so the pattern follows the curve.
# The pattern is engraved pocket_d deep from the outer surface (not through), so the vase holds water.
@param 100..250 desc:"Height (mm)"
H = 180
@param 25..60 desc:"Base radius of the outline (mm)"
r_mid = 40
@param 0..20 desc:"Bulge amplitude (mm)"
amp = 10
@param 2..5 step:0.1 desc:"Wall thickness (mm)"
wall = 3.0
@param 2..8 step:0.5 desc:"Bottom thickness (mm)"
bot = 4.0
@param 8..24 desc:"Cells per ring"
n_cell = 16
@param 4..20 desc:"Number of cell rows"
n_row = 13
@param 6..20 step:0.5 desc:"Row pitch (mm)"
pv = 11.0
@param 0.6..2 step:0.1 desc:"Pattern engraving depth (mm)"
pocket_d = 1.2
@param 0.8..4 step:0.1 desc:"Honeycomb rib width (mm)"
rib = 1.6
# Outline: r_mid-0.87amp at z=0, r_mid+amp at mid-height, narrowing again at the mouth
def rr(z) = r_mid + amp * sin(z * 300 / H - 60)
# The outline is revolved from a polyline (stacked conical frustums) rather than a spline.
# The radius of curvature is about 118mm, so 10mm chords deviate only about 0.1mm and look the same,
# while booleans get dramatically faster (the spline version took 4.5 minutes).
@param 12..48 desc:"Outline polyline segments"
n_sp = 18
dz = H / n_sp
# Lists cannot be joined with +, so the end points (two points on the axis) are mixed into the comprehension with if
prof_pts = [(if i == 0 then (0, 0) else (if i > n_sp + 1 then (0, H) else (rr((i - 1) * dz), (i - 1) * dz))) for i in range(n_sp + 3)]
outer = workplane XZ | polyline prof_pts | revolve Z
# Cavity: points at the outline radius minus the wall thickness (open 1mm above the mouth)
dzc = (H - bot) / n_sp
cav_pts = [(if i == 0 then (0, bot) else (if i > n_sp + 2 then (0, H + 1) else (if i > n_sp + 1 then (rr(H) - wall, H + 1) else (rr(bot + (i - 1) * dzc) - wall, bot + (i - 1) * dzc)))) for i in range(n_sp + 4)]
cavity = workplane XZ | polyline cav_pts | revolve Z
# Floor of the engraving = outline profile offset inward by pocket_d and revolved (sharp corners)
core = workplane XZ | polyline prof_pts | offset (-pocket_d) join:"miter" | revolve Z
# Honeycomb cell (hexagon with vertices at top and bottom). Width = circumference of that row / cell count
z0 = (H - (n_row - 1) * pv) / 2
hh = pv * 4 / 3 # full hexagon height (row pitch = 3/4 of full height)
def cell(z, ang) = workplane YZ
| polyline [(0, (hh - rib * 1.15) / 2),
((2 * pi * rr(z) / n_cell - rib) / 2, (hh - rib * 1.15) / 4),
((2 * pi * rr(z) / n_cell - rib) / 2, -(hh - rib * 1.15) / 4),
(0, -(hh - rib * 1.15) / 2),
(-(2 * pi * rr(z) / n_cell - rib) / 2, -(hh - rib * 1.15) / 4),
(-(2 * pi * rr(z) / n_cell - rib) / 2, (hh - rib * 1.15) / 4)]
| extrude 10
| translate (rr(z) - 4) 0 z
| rotate 0 0 ang
# A comprehension can have only one for, so a per-row function makes the double loop
def row(j) = union [cell(z0 + j * pv, (360 / n_cell) * (i + (j % 2) * 0.5)) for i in range(n_cell)]
cells = union [row(j) for j in range(n_row)]
outer - cavity - (cells - core)