/** This makes a 3-D model for a eyedropper holder with a hook that hangs in a refrigerator. */ // The resolution of the object in voxels/length. r = 254/in // Configure these for your cap. Note that your slicer software may force // minimum wall thicknesses that override these. innerDiam = 24 mm sidewallThickness = 1.5 mm outerDiam = innerDiam + 2 sidewallThickness topThickness = 2 mm height = 46 mm + topThickness holderWidth = 1.5 cm holderDepth = 6 mm holderHeight = 1 cm // The holder that clips to the refrigerator shelf. This is a cuboid that // reaches to the center of the cylinder (and will be cut out later.) holder = callJava["frink.graphics.VoxelArray", "construct", [-holderWidth/2 r, holderWidth/2 r, -(outerDiam/2 + holderDepth) r, 0, (height-holderHeight) r, (height) r, true]] // The channel inside the holder that goes over the shelf. Remove it from // the holder. channel = callJava["frink.graphics.VoxelArray", "construct", [-holderWidth/2 r, holderWidth/2 r, -(outerDiam/2 + 3.1 mm) r, (outerDiam/2) r, (height-holderHeight) r, (height-2 mm) r, true]] holder.remove[channel] // Outer main cylinder c1 = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, 0, 0, 0, height r, outerDiam/2 r]] c1 = c1.union[holder] // Inner main cylinder. Remove it from outer cylinder. cin = callJava["frink.graphics.VoxelArray", "makeCylinder", [0, 0, topThickness r, 0, 0, height r, innerDiam/2 r]] c1.remove[cin] c1.projectX[undef].show["X"] c1.projectY[undef].show["Y"] c1.projectZ[undef].show["Z"] filename = "dropperHolder.obj" print["Writing $filename..."] w = new Writer[filename] w.println[c1.toObjFormat["test", 1/(r mm)]] w.close[] println["done."]