sousvide.frink

Download or view sousvide.frink in plain text format


// This renders engineering templates for my sous vide cooker.
// All shapes print out at their designated sizes, so making
// engineering diagrams is easy.  These templates were printed and
// rubber-cemented onto a steel project box and cut out with a drill
// and a nibble-notch tool, which are actually the other handyman's secret
// weapons.
//
// Now if Frink could only control a computerized milling machine.
// Which, I guess, I'd have to have it build first.

g = new graphics

// PID controller
cy = -16 cm
g.drawRectCenter[0 cm, cy, 45 mm, 45 mm]
drawCross[g, 0 cm, cy]
g.font["SansSerif", 3 mm]
g.text["PID Controller", 0 cm, cy + 1 cm]

// Switches
cy = 0 cm
drawSwitch[g, -4 cm, cy, "Main", "Switch"]
drawSwitch[g, 0 cm, cy, "Heater", "Engage"]
drawSwitch[g, 4 cm, cy, "Pump", "Engage"]

// Heat sink
cx = 0 cm
cy = -6 cm
g.drawRectCenter[cx, cy, 5 cm, 8 cm]
g.drawRectCenter[cx, cy, 5 cm, 56 mm]
g.text["Heat Sink", cx, cy+.5 cm]
drawCross[g,cx,cy]
drawCross[g, cx, cy - 7/2 cm]
drawCross[g, cx, cy + 7/2 cm]

// Fan (approx 3 cm left of heat sink)
cx = cx - 3 cm -2.5 cm + 2.5 cm / 2
g.drawRectCenter[cx, cy, 2.5 cm, 6 cm]
drawCross[g,cx,cy]
g.text["Fan", cx, cy+5 mm]

// Fan (drill pattern)
cx = 8 cm
g.drawRectCenter[cx, cy, 6 cm, 6 cm]
g.drawRectCenter[cx, cy, 5.62 cm, 5.62 cm]
drawCircleWithCross[g, cx, cy, 60 mm]
drawCircleWithCross[g, cx-2.5 cm, cy-2.5 cm, 3 mm]
drawCircleWithCross[g, cx+2.5 cm, cy-2.5 cm, 3 mm]
drawCircleWithCross[g, cx-2.5 cm, cy+2.5 cm, 3 mm]
drawCircleWithCross[g, cx+2.5 cm, cy+2.5 cm, 3 mm]
g.text["Fan (drill pattern)", cx, cy+.5 cm]
vertSpace = 1.4 cm    // Space between center of bottom holes and base of box
boxBaseY = cy + 2.5 cm + vertSpace
g.line[cx-4 cm, boxBaseY, cx+4 cm, boxBaseY]
g.text["Bottom of box", cx, boxBaseY, "center", "bottom"]

// Outlet
cy = -12 cm
cx = 5.5 cm
g.drawRectCenter[cx, cy, 24.59 mm, 24.59 mm]
g.text["Outlet", cx, cy]

// Inlet
cy = -12 cm
cx = -2.5 cm
drawRoundedRectangle[g, cx, cy, 27.4 mm, 19.8 mm, 5.0 mm]
d = 3.4mm
drawCircleWithCross[g, cx+20 mm, cy, d]
drawCircleWithCross[g, cx-20 mm, cy, d]
g.text["Inlet", cx, cy]

// Circuit breaker
// Circuit breaker
cx = 2 cm
g.color[.7,.7,.7]
drawCircleWithCross[g, cx, cy, 16 mm]
g.color[0,0,0]
r =  16 mm / 2
ry = 14 mm / 2
rx = sqrt[r^2 - ry^2]
arclen = 2 arcsin[ry/r]

gp = new GeneralPath
gp.moveTo[cx-rx, cy-ry]
gp.lineTo[cx+rx, cy-ry]
gp.circularArc[cx, cy, -arclen]
gp.lineTo[cx-rx, cy+ry]
gp.circularArc[cx, cy, -arclen]
g.add[gp]
g.text["Circuit Breaker", cx, cy + 1 cm]

g.show[]
g.write["sousvide.svg", 8.5 in, 11 in]
//g.write["sousvide.html", 800, 800]
//g.browse["sousvide.html"]

drawSwitch[g is graphics, cx, cy, text1="", text2=""] :=
{
   g.drawRectSides[cx-11mm, cy-1.1mm, cx-10.1mm, cy+1.1 mm]
   drawCircleWithCross[g, cx, cy, 20.2 mm]
   g.text[text1, cx, cy-.5 cm]
   g.text[text2, cx, cy+.5 cm]
}

drawCross[g is graphics, cx, cy] :=
{
   g.line[cx-2 mm, cy, cx+2mm, cy]
   g.line[cx, cy-2mm, cx, cy+2mm]
}

drawCircleWithCross[g is graphics, cx, cy, diameter] :=
{
   drawCross[g, cx, cy]
   g.drawEllipseCenter[cx, cy, diameter, diameter]
}

drawRoundedRectangle[g is graphics, cx, cy, width, height, r] :=
{
   hw = width/2
   hh = height/2
   cxr = cx+hw-r
   cxl = cx-hw+r
   cyb = cy+hh-r
   cyt = cy-hh+r
   left = cx - hw
   right = cx + hw
   top = cy - hh
   bottom = cy + hh

   // Draw curved area to cut out in gray
   g.color[0.7,0.7,0.7]
   gp = new filledGeneralPath
   gp.moveTo[cxl, top]
   gp.lineTo[cxr, top]
   gp.circularArc[cxr,cyt,-90 deg]
   gp.lineTo[right, cyb]
   gp.circularArc[cxr,cyb,-90 deg]
   gp.lineTo[cxl, bottom]
   gp.circularArc[cxl, cyb, -90 deg]
   gp.lineTo[left,cyt]
   gp.circularArc[cxl,cyt,-90 deg]
   gp.close[]
   g.add[gp]

   g.color[0.7,0.7,0.7]
   g.drawRectCenter[cx,cy,width,height]
   
   g.color[0,0,0]
   g.drawEllipseCenter[cxl,cyt,2r,2r]
   drawCross[g,cxl,cyt]
   g.drawEllipseCenter[cxr,cyt,2r,2r]
   drawCross[g,cxr,cyt]
   g.drawEllipseCenter[cxl,cyb,2r,2r]
   drawCross[g,cxl,cyb]
   g.drawEllipseCenter[cxr,cyb,2r,2r]
   drawCross[g,cxr,cyb]

   g.line[cxr + r, cyt, cxr + r, cyb]
   g.line[cxl - r, cyt, cxl - r, cyb]
   g.line[cxl, cyt - r, cxr, cyt - r]
   g.line[cxl, cyb + r, cxr, cyb + r]
}


Download or view sousvide.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 19944 days, 16 hours, 37 minutes ago.