import static uk.co.nickthecoder.foocad.chamferedextrude.v1.ChamferedExtrude.* /* You can buy these quite easily, but I wanted some RIGHT AWAY, and I could only find them on-line. The "glide" has been oriented so that the weakness of layer lines are as small as possible However, the hoop part is connected to the neck by very little plastic. And the hoop itself looks really weak! The mass produced parts fail quite often (which is why I *needed* to print more), and so far my 3D printed version seems weirdly stronger (I haven't seen a failure yet). Unlike the mass produced parts, I can slot my glides in and out easily without taking the rail apart. (I needed to shave the mass produced parts to do the same Grr). FYI, the mass produced parts always fail at the thin part of the neck. My parts are weakest at the hoop. Print Notes The glide requires support material. Use the "tile" extension to print many copies at a time. */ class CurtainHooks : Model { var hookThickness = 3.0 var hookChamfer = 0.4 var gliderTabThickness = 2.0 @Piece fun hook() : Shape3d { return SVGParser().parseFile( "CurtainHooks.svg" ) .shapes["hook"] .center() .chamferedExtrude( hookThickness, hookChamfer ) .color( "Yellow" ) } @Piece fun glide() : Shape3d { val doc = SVGParser().parseFile( "CurtainHooks.svg" ) println( "Names = ${doc.shapes.keySet()}" ) val main2d = ( doc.shapes["glideHead"] + doc.shapes["glideNeck"] + doc.shapes["glideTail"] ) val profile = doc.shapes["glideProfile"].toOrigin() .extrude( main2d.size.y ) val main = main2d.toOrigin().extrude(profile.size.z) .rotateX(90).frontTo(0) val tab = doc.shapes["glideTab"].translate(-main2d.corner) .extrude( gliderTabThickness ) .rotateX(90).frontTo(0) val pin = Cylinder.hole( profile.size.y, tab.size.z/2, 10 ) .rotateX(-90) .translateX( tab.left + tab.size.x / 2 ) .translateZ( tab.bottom + tab.size.z / 2 ) return ((main / profile) + tab + pin).color("Orange") } override fun build() : Shape3d { return hook().rotateZ(90).toOrigin() + glide().translateY(12) } }