/** 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]] }