TopHat3D.frink

View or download TopHat3D.frink in plain text format


/** This renders a 3-D model to render a top-hat-like shape to Wavefront .obj
    file format for 3-D printing.

    See: http://paulbourke.net/dataformats/obj/
*/


sides = 100
stopDiam = 0.42 in
cylDiam = 19/128 in
cylHeight = 0.75 cm
stopHeight = 1.5 mm

w = new Writer["TopHat" + (stopDiam->in) + "x" + format[cylDiam, in, 2] + "x" + (cylHeight->mm) + ".obj"]
w.println["# Telescope Viewfinder by Frink\n"]
w.println["o viewfinder\n"]

cylBottom = new array[sides]
cylTop    = new array[sides]
stopTop     = new array[sides]
stopBottom  = new array[sides]

z0 = 0 mm
z1 = -stopHeight

angleStep = circle/sides

// The length unit
u = mm

for i = 0 to sides-1
{
   angle = i angleStep

   x = cylDiam/2 cos[angle]
   y = cylDiam/2 sin[angle]
   zt = cylHeight
   cylBottom.push[[x, y, z0, i+1]]
   cylTop.push[[x, y, zt, sides+i+1]]
   stopTop.push[[stopDiam/2 cos[angle], stopDiam/2 sin[angle], z0, 2 sides+i+1]]
   stopBottom.push[[stopDiam/2 cos[angle], stopDiam/2 sin[angle], z1, 3 sides+i+1]]
}

w.println["# Vertex list \n"]

w.println["\n# Cyl bottom"]
dumpVertices[cylBottom, w, u]

w.println["\n# Cyl top"]
dumpVertices[cylTop, w, u]

w.println["\n# Stop top"]
dumpVertices[stopTop, w, u]

w.println["\n# Stop bottom"]
dumpVertices[stopBottom, w, u]

w.println["# Face list\n"]
w.println["usemtl Default"]

// Now output the faces.  These should be output by vertex numbers in a
// counterclockwise "out" fashion.

topFace = "f"
bottomFace = new array

for i = 0 to sides-1
{
   // Cyl sides
   w.println["\n# Cyl sides"]
   [xt0, yt0, zt0, ovt0] = cylTop@i
   [xb0, yb0, zb0, ovb0] = cylBottom@i
   [xt1, yt1, zt1, ovt1] = cylTop@((i+1) mod sides)
   [xb1, yb1, zb1, ovb1] = cylBottom@((i+1) mod sides)
   w.println["f $ovt0 $ovb0 $ovb1 $ovt1"]

   // Upper surface of stop.
   [xt0, yt0, zt0, svt0] = stopTop@i
   [xb0, yb0, zb0, svb0] = stopBottom@i
   [xt1, yt1, zt1, svt1] = stopTop@((i+1) mod sides)
   [xb1, yb1, zb1, svb1] = stopBottom@((i+1) mod sides)
   w.println["\n# Upper Surface of stop"]
   w.println["f $ovb0 $svt0 $svt1 $ovb1"]

   // Sides of stop.
   w.println["\n# Sides of stop"]
   w.println["f $svt0 $svb0 $svb1 $svt1"]

   topFace = topFace + " " + ovt0
   bottomFace.push[svb0]   // We will reverse this later
}

w.println["\n# Top face"]
w.println[topFace]

w.println["\n# Bottom face"]
w.println["f " + join[" ", reverse[bottomFace]]]

w.close[]


/** Dump an array of vertices */
dumpVertices[array, writer, u] :=
{
   for [x,y,z] = array
      writer.println["v " + formatFix[x, u, 5] + " " + formatFix[y, u, 5] + " " + formatFix[z, u, 5]]
}


View or download TopHat3D.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 18660 days, 19 hours, 38 minutes ago.