/Tools/SuperGlueBase.foocad
My favourite brush-on super glue has a very narrow bottle which is easily knocked over.
It is designed to be a snug fit, so that lifting the bottle also lifts the base.
Print using TPU (or other flexible filament). You could use a rigid filament, but the fit would need to be perfect, or use a shim to jam the bottle into this base.
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.* import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.* import uk.co.nickthecoder.foocad.compound.v1.* import uk.co.nickthecoder.foocad.smartextrusion.v1.* import static uk.co.nickthecoder.foocad.smartextrusion.v1.SmartExtrusion.* import uk.co.nickthecoder.foocad.cup.v1.* import static uk.co.nickthecoder.foocad.cup.v1.Cup.* import static uk.co.nickthecoder.foocad.extras.v1.Extras.* class SuperGlueBase : Model { var size = Vector3( 36, 20, 20 ) var thickness = 1.8 var radius = 7.0 val lipSize = Vector2(2.5, 0.5) fun shape() = Circle( size.x/2 ).scaleY( size.y/size.x ) // The bottom should fit easily in one side, and "tricky" in the other. @Piece fun testFit() = shape().outline(1,0) .smartExtrude(lipSize.x * 2) .insideTop( fatLip( lipSize.x, lipSize.y ) ) override fun build() : Shape3d { val tube = shape().offset(thickness) .cup( 20, thickness ) .baseThickness( thickness + 0.5 ) .cavity(true) .insideBottom( Fillet(2) ) .insideTop( fatLip( lipSize.x, lipSize.y ) ) .outsideTop( Chamfer(0.5) ) val base1 = Cylinder(2, size.x/2+2 ) val base2 = Cylinder(10, size.x/2+2, size.y/2).bottomTo( base1.top ) val tread = Square( 50, 1 ).tileY( 25, 1 ) .center() .rotate(45) .intersection( Circle( size.x/2-2 ) ) .extrude(0.4) .bottomTo(-0.01) return Compound( true ).apply { + tube + base1 + base2 - tread }.build().rotateZ(45) } }