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, 10 hours, 34 minutes ago.