Tool Spring Clip
A wall clip for a broom, mop or garden tool: a back plate with two countersunk screw holes and a C-shaped spring sized from the handle diameter. The mouth is narrower than the handle, so the arms flex open as the handle is pushed in and snap back to hold it, and the rounded tips act as a lead-in. The default grips a 25 mm handle and measures 56 x 28 x 20 mm. It is modelled and printed flat with the C profile on the bed, so the arms flex within the layers, their strongest direction; no supports. Adjustable parameters: handle diameter, grip depth, spring wall thickness, clip height and plate thickness.
# Tool Spring Clip - wall clip with a C-shaped spring that grips a broom or tool handle
#
# A back plate with two countersunk screw holes and a C-shaped spring sized from the
# handle diameter: the mouth is narrower than the handle by twice `grip`, so the arms
# flex open as the handle is pushed in and snap back to hold it. The tips are rounded
# as a lead-in. Modelled and printed flat, C profile on the bed: the arms flex in the
# plane of the layers, which is their strongest direction. No supports.
@param 15..40 step:0.5 desc:"Handle diameter (mm)"
$d = 25
@param 1.5..4 step:0.25 desc:"How far each tip reaches in past the handle diameter (mm)"
$grip = 2.5
@param 2..3.5 step:0.1 desc:"Spring wall thickness (mm)"
$wall = 2.4
@param 15..30 step:1 desc:"Clip height, along the handle (mm)"
$h = 20
@param 3..6 step:0.5 desc:"Back plate thickness (mm)"
$plate_t = 4
$ri = $d / 2 + 0.2 # the handle sits with a touch of play
$ro = $ri + $wall
$cy = $plate_t + $ro - 1 # ring centre: the ring sinks 1 mm into the plate
$plate_w = 2 * $ro + 26
$mouth = $d - 2 * $grip # opening between the tip rounds
$tip_r = $wall / 2
# tip centres: on the ring's mean radius where the opening half-width equals mouth/2
$rm = $ri + $wall / 2
$tx = $mouth / 2 + $tip_r
assert $tx < $rm
$ty = $cy + sqrt($rm * $rm - $tx * $tx)
$ring = (circle $ro at:(0, $cy)) - (circle $ri at:(0, $cy))
$cutter = polyline [(-$tx, $ty), ($tx, $ty), ($tx + 2 * $ro, $ty + 3 * $ro), (-$tx - 2 * $ro, $ty + 3 * $ro)] # wedge above the tips
$tips = (circle $tip_r at:(-$tx, $ty)) + (circle $tip_r at:($tx, $ty))
$profile = (($ring - $cutter) + $tips) + (rect $plate_w $plate_t at:(0, $plate_t / 2))
$body = $profile | extrude $h
$screw = (cylinder 2.3 ($plate_t + 2) | rotate 90 0 0) + (cone 4.8 2.3 2.5 center:(true, true, false) | rotate 90 0 0 | translate 0 ($plate_t + 0.01) 0) # wide end on the front face
$screws = union [$screw | translate $x ($plate_t / 2) ($h / 2) for $x in [-$plate_w / 2 + 7, $plate_w / 2 - 7]]
$clip = $body - $screws
assert $clip.solids == 1
assert $clip.bbox.x ~ $plate_w
assert $clip.bbox.z ~ $h
assert $mouth >= $d * 0.6 # the arms do not have to open absurdly far
# the handle in place overlaps nothing but the tips are inside its diameter
$handle = cylinder ($d / 2) ($h + 2) at:(0, $cy) | translate 0 0 -1
$handle_core = cylinder ($mouth / 2 - 0.1) ($h + 2) at:(0, $cy) | translate 0 0 -1
assert clear($handle, $clip)
print "clip" $clip.bbox
print "mouth opening (mm)" $mouth
$clip