From fb5398b30daa1f73d759005e49bd50906d824d22 Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Wed, 8 Feb 2017 22:29:15 +0100 Subject: [PATCH] PoleHook: Initial commit --- boxes/generators/polehook.py | 139 +++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 boxes/generators/polehook.py diff --git a/boxes/generators/polehook.py b/boxes/generators/polehook.py new file mode 100644 index 0000000..7bc0d55 --- /dev/null +++ b/boxes/generators/polehook.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +# Copyright (C) 2013-2016 Florian Festi +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from boxes import * + +class PoleHook(Boxes): # change class name here and below + """Hook for pole like things to be clamped to another pole""" + + def __init__(self): + Boxes.__init__(self) + + # Uncomment the settings for the edge types you use + self.addSettingsArgs(edges.FingerJointSettings) + + # Add non default cli params if needed (see argparse std lib) + self.argparser.add_argument( + "--diameter", action="store", type=float, default=50., + help="diameter of the thing to hook") + self.argparser.add_argument( + "--screw", action="store", type=float, default=7.8, + help="diameter of the screw in mm") + self.argparser.add_argument( + "--screwhead", action="store", type=float, default=13., + help="with of the screw head in mm") + self.argparser.add_argument( + "--screwheadheight", action="store", type=float, default=5.5, + help="height of the screw head in mm") + self.argparser.add_argument( + "--pin", action="store", type=float, default=4., + help="diameter of the pin in mm") + + def fork(self, d, w, edge="e", full=True, move=None): + tw = d + 2 * w + th = 2 * d + + if self.move(tw, th, move, True): + return + + e = self.edges.get(edge, edge) + + + self.moveTo(0, e.margin()) + + if e is self.edges["e"]: + self.bedBoltHole(tw) + else: + e(tw, bedBolts=edges.Bolts(1)) + if full: + self.hole(-0.5*w, 2*d, self.pin/2) + self.polyline(0, 90, 2*d, (180, w/2), d, (-180, d/2), + 0.5*d, (180, w/2), 1.5 * d, 90) + else: + self.polyline(0, 90, d, 90, w, 90, 0, (-180, d/2), + 0.5*d, (180, w/2), 1.5 * d, 90) + + self.move(tw, th, move) + + def lock(self, l1, l2, w, move=None): + l1 += w/2 + l2 += w/2 + if self.move(l1, l2, move, True): + return + self.hole(w/2, w/2, self.pin/2) + self.moveTo(w/2, 0) + self.polyline(l2-w, (180, w/2), l2-2*w, (-90, w/2), l1-2*w, (180, w/2), + l1-w, (90, w/2)) + self.move(l1, l2, move) + + def backplate(self): + tw = self.diameter + 2*self.ww + t = self.thickness + b = edges.Bolts(1) + bs = (0.0, ) + self.fingerHolesAt(-tw/2, -2*t, tw, 0, bedBolts=b, bedBoltSettings=bs) + self.fingerHolesAt(-tw/2, 0, tw, 0, bedBolts=b, bedBoltSettings=bs) + self.fingerHolesAt(-tw/2, +2*t, tw, 0, bedBolts=b, bedBoltSettings=bs) + + def clamp(self): + d = self.diameter + 2 * self.ww + self.moveTo(10, -0.5*d, 90) + self.edge(d) + self.moveTo(0, -8, -180) + self.edge(d) + + def render(self): + # adjust to the variables you want in the local scope + d = self.diameter + t = self.thickness + # Initialize canvas + self.open() + + shh = self.screwheadheight + self.bedBoltSettings = (self.screw, self.screwhead, shh, d/4+shh, d/4) # d, d_nut, h_nut, l, l + self.ww = ww = 4*t + self.fork(d, ww, "f", move="right") + self.fork(d, ww, "f", move="right") + self.fork(d, ww, "f", full=False, move="right") + self.fork(d, ww, full=False, move="right") + self.fork(d, ww, full=False, move="right") + + self.parts.disc(d+2*ww, callback=self.backplate, hole=self.screw, move="right") + self.parts.disc(d+2*ww, hole=self.screw, move="right") + self.parts.disc(d+2*ww, callback=self.clamp, hole=self.screw+0.5*t, move="right") + self.parts.disc(d+2*ww, hole=self.screw+0.5*t, move="right") + self.parts.waivyKnob(50, callback=lambda:self.nutHole(12.75), + move="right") + self.parts.waivyKnob(50, callback=lambda:self.nutHole(12.75), + move="right") + self.parts.waivyKnob(50, hole=self.screw+0.5*t, move="right") + + ll = ((d**2 + (0.5*(d+ww))**2)**0.5) - 0.5 * d + for i in range(3): + self.lock(ll, ll, ww, move="right") + + for i in range(2): + self.parts.disc(ww, move="up") + + self.close() + +def main(): + b = PoleHook() # change to class name + b.parseArgs() + b.render() + +if __name__ == '__main__': + main()