Ribbed Door Wedge
A low door stop wedge that slides under a door and holds it open. The ramp starts at a 4 mm tip and rises at about 13 deg to 28 mm, a self-locking angle, so the door presses the wedge onto the floor instead of pushing it away; V-groove ribs on the sole grip the floor, or a shallow pocket takes a glued rubber pad. A round finger loop at the back makes it easy to pull out. The default wedge measures 120 x 28 x 40 mm. Print it lying on its side with no supports; PETG or PLA works, TPU gives the best grip on smooth floors. Adjustable parameters: door gap, tip height, back height, length, width, finger hole size and the sole style (ribs, pad pocket or flat).
# Door Wedge - low ramp door stop with a grip-ribbed sole and a finger loop
#
# Use: push the thin tip under the door, from the side the door opens toward,
# until the ramp touches the bottom edge of the door. The ramp rises at about
# 12 deg, a self-locking angle, so the door presses the wedge down onto the
# floor instead of pushing it away. The ribbed sole grips the floor; or choose
# the pad option and glue a 1 mm rubber or silicone sheet into the shallow
# pocket. Pull it out by the round finger loop at the back.
#
# Print orientation: as modeled, lying on its side (one side face on the bed,
# the ramp profile in the XY plane, the width along Z). The profile, the ribs
# and the finger hole are all vertical walls, so no supports are needed.
# Coordinates: X = length (tip at X = 0), Y = height above the floor, Z = width.
@param 6..18..0.5 group:"Door" desc:"Gap under the door (mm); the tip must slide in, the ramp must reach above it"
door_gap = 10
@param 2..8..0.5 group:"Ramp" desc:"Height of the thin tip (mm)"
tip_h = 4
@param 20..40 group:"Ramp" desc:"Height at the back, the top of the finger loop (mm)"
back_h = 28
@param 110..200 step:5 group:"Ramp" desc:"Overall length including the finger loop (mm); keep the ramp under 15 deg"
length = 120
@param 25..80 group:"Ramp" desc:"Width (mm)"
width = 40
@param 10..24 group:"Loop" desc:"Finger hole diameter (mm)"
hole_d = 16
@param choices:["ribs", "pad", "flat"] group:"Sole" desc:"Sole: grip ribs, pocket for a rubber pad, or flat"
sole = "ribs"
# --- Fixed details ---
R = back_h / 2 # finger loop: half circle around the back end
ramp_l = length - R # length of the sloped part
rib_d = 1.2 # depth of each 90 deg V groove
rib_p = 4 # groove pitch
rib_x0 = 15 # keep the thin tip smooth
pad_t = 1.2 # rubber pad pocket depth
pad_rim = 3 # rim left around the pad pocket
angle = atan((back_h - tip_h) / ramp_l)
x_touch = (door_gap - tip_h) / (back_h - tip_h) * ramp_l # where the door edge meets the ramp
# --- Side profile (XY), extruded across the width ---
body = sketch [
(0, 0),
(ramp_l, 0),
arc (ramp_l, 0) (length, R) (ramp_l, back_h),
(0, tip_h),
(0, 0)
] | extrude width
$hole = cylinder (hole_d / 2) (width * 3) at:(ramp_l, R)
# V grooves across the sole, from rib_x0 to just before the loop
n_rib = floor((ramp_l - 4 - rib_x0) / rib_p) + 1
groove = polyline [(-rib_d, -0.1), (rib_d, -0.1), (0, rib_d)] | extrude (width + 2) | translate 0 0 -1
grooves = union [groove | translate (rib_x0 + i * rib_p) 0 0 for i in range(n_rib)]
# Pad pocket in the sole (a 1.2 mm deep recess; its ceiling is a short side wall in print)
pad_l = ramp_l - rib_x0
pocket = box pad_l (pad_t * 2) (width - pad_rim * 2) | translate (rib_x0 + pad_l / 2) 0 (width / 2)
wedge0 = body - $hole
$wedge = if sole == "ribs" then wedge0 - grooves else (if sole == "pad" then wedge0 - pocket else wedge0)
# --- Intent ---
assert tip_h <= door_gap - 2 # tip slides under the door with room to spare
assert back_h >= door_gap + 10 # ramp rises well past the door edge
assert x_touch > 5 # door meets the slope, not the blunt tip
assert x_touch < ramp_l - 20 # and leaves room to push it further in
assert angle < 15 # shallow enough to self-lock
assert R - hole_d / 2 >= 4 # loop wall around the finger hole
assert $wedge.solids == 1
assert $wedge.bbox.x ~ length
assert $wedge.bbox.y ~ back_h
assert $wedge.bbox.z ~ width
assert $wedge.bbox.min[0] ~ 0 tol:0.01
assert $wedge.bbox.min[1] ~ 0 tol:0.01
assert $wedge.bbox.min[2] ~ 0 tol:0.01
print "ramp angle (deg)" angle
print "door edge meets the ramp at X (mm)" x_touch
$wedge