133 lines
4.9 KiB
Python
133 lines
4.9 KiB
Python
|
#!/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 <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
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()
|
||
|
|