/** This program makes a squeezer to squeeze the last drops out of a liquid packet. It renders a file for 3-D printing. This extends the design by using new supertoroids for making more comfortable scissor holes. */ r = 254/in height = 7 mm armLength = 5.5 in armDepth = 7 mm ringThickness = 4 mm ring1Diam = 23 mm ring2Diam = 26 mm gap = 0.3 mm // The hinge v = callJava["frink.graphics.VoxelArray", "construct" , [0 mm r, 10 mm r, -armDepth r, armDepth r, 0 mm r, height r, true]] // Arms a1 = callJava["frink.graphics.VoxelArray", "makeRoundedCube", [9 mm r, (9 mm + armLength) r, gap/2 r, armDepth r, 0 mm r, height r, 1 mm r]] a2 = callJava["frink.graphics.VoxelArray", "makeRoundedCube", [9 mm r, (9 mm + armLength) r, -armDepth r, -gap/2 r, 0 mm r, height r, 1 mm r]] // Ring1 (finger) r1 = callJava["frink.graphics.VoxelArray", "makeSupertoroid", [(1/2 ring1Diam + 1/2 ringThickness) r, 1/2 ringThickness r, 1/2 ringThickness r, 1.001 height/2 r, .5, 1]] rcx = (9 mm + armLength - (1/2 ring1Diam)) rcy = armDepth + (1/2 ring1Diam) r1.translate[round[rcx r], round[rcy r], round[height/2 r]] a1 = a1.union[r1] // Ring2 (thumb) r2 = callJava["frink.graphics.VoxelArray", "makeSupertoroid", [(1/2 ring2Diam + 1/2 ringThickness) r, 1/2 ringThickness r, 1/2 ringThickness r, 1.001 height/2 r, .5, 1]] rcx = (9 mm + armLength - 1cm - (1/2 ring2Diam)) rcy = -armDepth - (1/2 ring2Diam) r2.translate[round[rcx r], round[rcy r], round[height/2 r]] a2 = a2.union[r2] v = v.union[a1] v = v.union[a2] // Add text t1 = text["Over hill, over dale...", .8 armDepth r, 1.4 mm r] t1.translate[round[(9 mm + armLength/2) r], round[armDepth/2 r] , round[height r]] v=v.union[t1] t2 = text["Korean clamp will never fail!", .8 armDepth r, 1.4 mm r] t2.translate[round[(9 mm + armLength/2) r], round[-armDepth/2 r] , round[height r]] v=v.union[t2] v.projectX[undef].show["X"] v.projectY[undef].show["Y"] v.projectZ[undef].show["Z"] filename = "squeezy2.obj" print["Writing $filename..."] w = new Writer[filename] w.println[v.toObjFormat["squeezy", 1/(r mm)]] w.close[] println["done."] /** Extrude text along a plane and create a VoxelArray of it. */ text[str, textHeight, depth] := { g = new graphics g.font["SansSerif", "bold", 10] g.text[str, 0, 0] img = g.toImage[undef, round[textHeight]].autocrop[] return callJava["frink.graphics.VoxelArray", "extrudeZ", [img, round[depth]]] }