TelescopeViewfinder.frink

View or download TelescopeViewfinder.frink in plain text format


/** This renders a 3-D model to fix my telescope viewfinder  to Wavefront .obj
    file format for 3-D printing.

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


sides = 100
stopDiam = 1.25 in
cylDiam = 1.195 in
b = .6757 in

w = new Writer["TelescopeViewfinder1.195.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 = -2 mm

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 = x + b
   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 TelescopeViewfinder.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, 3 hours, 12 minutes ago.