FooCAD Source Codeimport static uk.co.nickthecoder.foocad.extras.v1.Extras.*
import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout2d.*
import static uk.co.nickthecoder.foocad.layout.v1.Layout3d.*
/**
A basic case for a Raspberry Pi 3.
Comes in two pieces (top and bottom), which are held together using 4 screws.
I used the following design as inspiration :
https://www.myminifactory.com/object/3d-print-raspberry-pi-3-case-51864
But I created this from scratch. Improvements made :
+ Ventalation holes
+ Option to cover the header pins and/or ribbon cable connectors
+ Option to add places for magnets, so that the pi can stick to the side
of my 3D printers. (I use the Pi as an OctoPrint server).
- Uses 16mm M3 bolts, but I really should have used M2 (but I didn't have any),
so I needed to widen the holes on the PI.
*/
class Pi3Case : Model {
@Custom
var thickness = 1.6
@Custom
var cableSlots = true
@Custom
var headerSlot = false
@Custom
var magnetD = 11.0
@Custom
var magnetT = 1.0
fun profile() = Square( 86, 57 ).center().roundAllCorners(3.5)
fun arrangeMounts( shape : Shape3d ) = shape
.translate( -39,24.5, 0 )
.mirrorY().also()
.translateX(58).also()
@Piece
fun bottom() : Shape3d {
val profile : Shape2d = profile()
val thumb = Circle( 10 ).rightTo( profile.left + 3.5 )
val post = Cylinder( 3, 4, 2.5 ).translateZ(thickness-0.01) - Cylinder( 10, 1.5 )
val posts = arrangeMounts( post )
val screwHoles = arrangeMounts(
Circle(3.3).sides(6).chamferedExtrude(3.5, 0, 1).translateZ(-0.01)
)
var result : Shape3d = (profile - thumb).extrude(thickness).color("Orange") +
posts -
screwHoles
if (magnetD > 0 && magnetT > 0) {
result -= Cylinder( magnetT, magnetD/2 )
.translate( 28, 14, 0 )
.mirrorX().also()
.mirrorY().also()
}
return result
}
@Piece
fun top() : Shape3d {
var profile : Shape2d = profile()
if ( cableSlots == true ) {
val slot = Square( 2.5, 22 ).roundAllCorners(1)
profile -= slot.center()
.translate(-37.75,0)
.translate(39.75,16.5).also()
}
if (headerSlot) {
profile -= Square( 52, 6 ).center().translate(-10,-24.5)
}
profile -= Square( 22, 16.5 ).translate( 23, 9.5 )
profile -= Square( 18, 14 ).translate( 27, -8 ).translateY(-18).also()
val airHole = Circle( 1 ).sides(6).rotate(30)
val airHoles = airHole +
airHole.repeatCircular(3,6) +
airHole.repeatCircular(6,12) +
airHole.repeatCircular(9,18)
profile -= airHoles.scale(1.7).translateX(-17)
val post = Cylinder( 3, 4, 2.5 ).translateZ(thickness) +
Cylinder( 8.5, 2.5 ).translateZ(thickness) -
Cylinder( 11, 1.5 )
val posts = arrangeMounts( post )
val headerSpace = Cube( 52, 6, 8 ).centerXY().translate(-10,-24.5,thickness)
val screwHoles = arrangeMounts( Cylinder(10,1.5) )
return profile.chamferedExtrude(thickness, 0.5,0).color("Orange") +
posts -
headerSpace -
screwHoles
}
override fun build() : Shape3d {
val bottom : Shape3d = bottom()
return bottom + top().mirrorZ().bottomTo( bottom.top + 1 )
}
}