-
Translucent Soap Dishes
A SquidWrench meeting discussion about printing transparent objects prompted me to conjure a soap dish from the vasty digital deep:

Shower Soap Dish – solid model They’re all done in “natural” PETG with sufficient variations in speed, temperature, extrusion multiplier, and fill pattern to stock the shower & tub:

Translucent soap dishes The single-thread sidewalls came out reasonably translucent in all the variations, but the baseplate remained stubbornly white-ish, even at 20 mm/s and 250 °C with 100% infill. The seams where the extruder retracts and lifts to the next layer remain conspicuous, with a scarf joint forming the white slab in the left-rear dish.
Quite a while ago, I’d considered making soap dishes with shattered-glass bottoms, but came to my senses. These have some key advantages:
- Exactly the right size for narrow shower shelves
- Light enough to not damage anything when it inevitably falls off
- Reasonably unbreakable when that happens
- Easily replaced
They’re also test pieces for the whole transparency thing, so it’s all good.
The OpenSCAD source code as a GitHub Gist:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters// Shower soap dish // Ed Nisley – KE4ZNU // 2026-01-13 include <BOSL2/std.scad> /* [Hidden] */ HoleWindage = 0.2; Protrusion = 0.1; NumSides = 3*3*4; $fn=NumSides; ID = 0; OD = 1; LENGTH = 2; WallThick = 0.6; BaseThick = 2.0; //DishOA = [80.0,40.0,20.0]; // standing used Dove DishOA = [90.0,50.0,30.0]; // standing Dove //DishOA = [100.0,65.0,30.0]; // half-bar DishTaper = [10.0,10.0]; CornerRadius = 15.0; DrainOA = [10.0,DishOA.y,3.0]; DrainOC = DishOA.x/3; //———- // Build it difference() { union() { linear_extrude(BaseThick) rect([DishOA.x,DishOA.y] – DishTaper,rounding=CornerRadius); rect_tube(DishOA.z,wall=WallThick, size1=[DishOA.x,DishOA.y] – DishTaper,size2=[DishOA.x,DishOA.y], rounding=CornerRadius,anchor=BOTTOM); } for (j=[-1,1]) right(j*DrainOC/2) up(BaseThick) cuboid(DrainOA,rounding=1.0,anchor=BOTTOM+BACK); }