/** This makes an armillary sphere for 3-D printing. */ res = 254/in ringHeight = 1 cm ringOuterRadius = 3.5 in / 2 ringThickness = 2.4 mm ring = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, 0, 0, 0, ringHeight res, ringOuterRadius res]] ring2 = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, 0, 0, 0, ringHeight res, (ringOuterRadius-ringThickness) res]] ring.remove[ring2] tickHeight = 1.2 mm tickRadius = .3 mm textDepth = ringThickness/2 for angle = 0 to 350 step 10 { g = new graphics g.font["SansSerif", "bold", 1] g.text[angle, 0, 0] img = new image[g, undef, round[.4 ringHeight res]] x = ringOuterRadius cos[-angle deg] y = ringOuterRadius sin[-angle deg] text = callJava["frink.graphics.VoxelArray", "extrudeZ", [img, round[-textDepth res], round[textDepth res]]] text = text.rotateXYZ[0,0,0, 90 deg, 90 deg, (-angle + 90) deg] text.translate[round[x res], round[y res], round[ringHeight/2 res]] ring.remove[text] // Make ticks tick = callJava["frink.graphics.VoxelArray", "makeCappedCylinder", [x res, y res, ringHeight res, x res, y res, (ringHeight-tickHeight) res, tickRadius res]] ring.remove[tick] tick = callJava["frink.graphics.VoxelArray", "makeCappedCylinder", [x res, y res, 0, x res, y res, tickHeight res, tickRadius res]] ring.remove[tick] } v = ring v.projectX[undef].show["X"] v.projectY[undef].show["Y"] v.projectZ[undef].show["Z"] filename = "ArmillarySphere.obj" print["Writing $filename..."] w = new Writer[filename] w.println[v.toObjFormat["armillary", 1/(res mm)]] w.close[] println["done."]