FooCAD Source Codeimport static uk.co.nickthecoder.foocad.arrange.v1.Arrange.*
/**
Drill a pair of holes in the top, and fill with blood red (tomato) juice.
Comprises of three pieces, a hollow heart, a stand and a tiny funnel.
*/
class HeartGlass : Model {
var size = 20
var thickness = 1.2
@Custom
var name = "Nick"
@Custom
var name2 = "2020"
fun half( thickness : double ) : Shape3d {
return Hull3d(
Sphere(size/3-thickness).translateZ(10),
Sphere(size-thickness).scaleY(0.8).translate( size * 2/3, 0, size * 2 ),
Sphere(size-thickness).scaleY(0.85).translate( 0,0,size * 1.7 )
).color( "Red" )
}
fun outside() = half( 0 ).mirrorX().also()
fun inside() = half( thickness ).mirrorX().also()
@Piece
fun heart() = outside() - inside()
@Piece
fun stand() : Shape3d {
return Square( size*2,size * 4 / 3 )
.center()
.roundAllCorners( 5 )
.extrude( size * 4/3 ) -
half( -0.3 )
.mirrorX().also()
.translateZ(2) -
Cylinder( 10, 11 ).center() -
Cylinder( 40, 3 ).center().rotateY(-10).translateX(13).mirrorX().also() -
Text( name,9 ).centerX().extrude( 2 ).rotateX(90).translate( 0,-12,3 ) -
Text( name2,9 ).centerX().extrude( 2 ).rotateX(90).translate( 0,-12,3 ).rotateZ(180)
}
@Piece
fun funnel() : Shape3d {
val outside = Cylinder( 20, 10, 0 ) +
Cylinder( 20, 3 ).sides( 10 )
val inside = Cylinder( 20, 10, 0 ).translateZ(-2) +
Cylinder( 50, 2.3 ).sides( 10 )
return outside - inside
}
override fun build() : Shape3d {
return arrangeX( 10,
heart(),
stand(),
funnel()
)
}
}