sousvide.frink

View or download 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]
}


View or download 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 17596 days, 22 hours, 4 minutes ago.