Exit Full View
Up

/Kitchen/CanCoasterCosy.foocad

CanCoasterCosy

Gives a more stable base for drink cans, and acts as a coaster. Useful for rough surfaces. Anyone for a picnic?

Has the option to add a brim for cans that are too skinny (that value style over function).

Can also be used to create a can-cosy, which keeps your hand warm, and the drink cold by adding a layer of insulation. Consider using thin perimeters, and low infill to trap air.

I used PETG, as it slightly flexible, rather than brittle.

NOTE. If you make the diamter a good fit, and have sufficient height, the coaster lifts up due to low preasure (as air cannot get in fast enough). Fun/annoying depending your mentality ;-)

Consider using fuzzy skin for a can-cozy. It gives a nicer textured feel, and extra grip.

FooCAD Source Code
import static uk.co.nickthecoder.foocad.arrange.v1.Arrange.*
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.*

class CanFoot : Model {

    // 54 for RedBull cans.
    @Custom( about="Internal diameter and height" )
    var diameter = 66.8
    
    @Custom
    var height = 15

    @Custom( about="Wall and base thickness" )
    var thickness = 1.7
    
    @Custom( about="Additional width at the base" )
    var brim = 0

    @Custom
    var holeDiameter= 0

    @Piece
    meth sizeTest() : Shape3d {
        val inside = Circle( diameter / 2 )
        val outside = inside.offset( thickness )

        return (outside - inside).extrude(0.8)
    }

    @Slice( fillDensity=5, perimeters=2 )
    @Piece
    meth coaster() : Shape3d {
    
        val inside = Circle( diameter / 2 )
        val outside = inside.offset( thickness )

        val cup = Cup( outside, height, thickness )
            .baseThickness( thickness - 0.01 )
            .top( Chamfer( thickness / 4 ) )
            .insideBottom( Fillet( 3 ) )

        val base = inside.offset( brim + thickness )
            .smartExtrude( thickness )
            .top( Fillet( thickness/3 ) )
            .bottom( roundedChamfer( thickness/3 ) )

        val fillet = ( outside.offset(brim - thickness) - outside )
            .smartExtrude( brim -thickness -0.1 )
            .outsideTop( Cove( brim-thickness ) )
            .bottomTo( base.top -0.01 )
        
        val can = Circle( diameter/2-0.1 )
            .smartExtrude( Math.max(115, height+10) )
                .bottom( Cove( 7 ) )
                .top( Chamfer( 5, 12 ) )
            .bottomTo( thickness )
            .previewOnly()

        val hole = if (holeDiameter > 0) {
            Circle( holeDiameter/2 )
                .smartExtrude( thickness + 0.02 )
                .edges( roundedChamfer( thickness / 3 ).reverse() )
                .bottomTo(-0.01)
        } else {
            null
        }
        
        if (brim > 0) {
            return cup + fillet + base - hole + can
        } else {
            return cup.outsideBottom( roundedChamfer( thickness*2 ) ) + can
        }
    }

    func variety() : Shape3d {

        val coke = CanFoot().apply {
            diameter = 66.8
        }.coaster()

        val cokeCosy = CanFoot().apply {
            diameter = 66.8
            height = 97
            thickness = 6
        }.coaster()

        val redBull = CanFoot().apply {
            diameter = 54
            brim = 10
        }.coaster()

        val redBullCosy = CanFoot().apply {
            diameter = 54
            height = 124
        }.coaster()

        return arrangeX( coke,  cokeCosy,  redBull, redBullCosy )
    }

    @Piece( printable=false )
    override fun build() = variety()
}