New generator: Shoe
A pen holder looking like a shoe or boot
This commit is contained in:
parent
84ef9d84ee
commit
9d3f8268a2
|
@ -0,0 +1,146 @@
|
||||||
|
#!/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 Shoe(Boxes):
|
||||||
|
"""Shoe shaped box"""
|
||||||
|
|
||||||
|
description = """Shoe shaped box with flat sides and rounded top.
|
||||||
|
Works best if flex if under slight compression.
|
||||||
|
Make sure that the following conditions are met:
|
||||||
|
y > tophole + r + fronttop;
|
||||||
|
height > frontheight."""
|
||||||
|
|
||||||
|
ui_group = "Misc"
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
Boxes.__init__(self)
|
||||||
|
|
||||||
|
self.addSettingsArgs(edges.FingerJointSettings)
|
||||||
|
self.addSettingsArgs(edges.FlexSettings)
|
||||||
|
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--width", action="store", type=float, default=65,
|
||||||
|
help="width of the shoe")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--length", action="store", type=float, default=175,
|
||||||
|
help="length front to back")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--height", action="store", type=float, default=100,
|
||||||
|
help="height at the back of the shoe")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--frontheight", action="store", type=float, default=35,
|
||||||
|
help="height at the front of the shoe")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--fronttop", action="store", type=float, default=20,
|
||||||
|
help="length of the flat part at the front of the shoe")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--tophole", action="store", type=float, default=75,
|
||||||
|
help="length of the opening at the top")
|
||||||
|
self.argparser.add_argument(
|
||||||
|
"--radius", action="store", type=float, default=30,
|
||||||
|
help="radius of the bend")
|
||||||
|
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
x, y, h = self.width, self.length, self.height
|
||||||
|
t = self.thickness
|
||||||
|
|
||||||
|
hf = self.frontheight
|
||||||
|
yg = self.tophole
|
||||||
|
tf = self.fronttop
|
||||||
|
r=self.radius
|
||||||
|
|
||||||
|
if (hf > h):
|
||||||
|
# Give an error because the result will be wrong with possible unconnected paths
|
||||||
|
raise ValueError("Height at front of shoe must be less than height at back of shoe.")
|
||||||
|
|
||||||
|
stretch = (self.edges["X"].settings.stretch)
|
||||||
|
|
||||||
|
self.ctx.save()
|
||||||
|
self.rectangularWall(y, x, "FFFF", move="up", label="Bottom")
|
||||||
|
lf,a=self.shoeside(y,h,hf,yg,tf,r, move="up", label="Side")
|
||||||
|
self.shoeside(y,h,hf,yg,tf,r, move="mirror up", label="Side")
|
||||||
|
self.ctx.restore()
|
||||||
|
self.rectangularWall(y, x, "FFFF", move="right only")
|
||||||
|
self.rectangularWall(x, h, "ffef", move="up", label="Back")
|
||||||
|
self.rectangularWall(x, hf, "ffff", move="up", label="front")
|
||||||
|
dr = a*(r-t)/stretch
|
||||||
|
self.shoelip(x, tf, dr, lf, label="top")
|
||||||
|
|
||||||
|
|
||||||
|
def shoelip(self, x, tf, dr, lf, move=None, label=""):
|
||||||
|
|
||||||
|
w = self.edges["F"].spacing()
|
||||||
|
|
||||||
|
th = tf + dr + lf + self.edges["F"].spacing() + self.edges["e"].spacing()
|
||||||
|
tw = x + 2*w
|
||||||
|
if self.move(tw, th, move, True, label=label):
|
||||||
|
return
|
||||||
|
|
||||||
|
self.moveTo(self.edges["F"].spacing(), self.edges["e"].spacing())
|
||||||
|
|
||||||
|
self.edges["F"](x)
|
||||||
|
self.edgeCorner("F", "F")
|
||||||
|
self.edges["F"](tf)
|
||||||
|
self.edges["X"](dr, h=x+2*w)
|
||||||
|
self.edges["F"](lf)
|
||||||
|
self.edgeCorner("F", "e")
|
||||||
|
self.edges["e"](x)
|
||||||
|
self.edgeCorner("e", "F")
|
||||||
|
self.edges["F"](lf)
|
||||||
|
self.edges["E"](dr)
|
||||||
|
self.edges["F"](tf)
|
||||||
|
self.edgeCorner("F", "F")
|
||||||
|
|
||||||
|
self.move(tw, th, move, label=label)
|
||||||
|
|
||||||
|
def shoeside(self, y, h, hf, yg, tf, r, move=None, label=""):
|
||||||
|
import math
|
||||||
|
|
||||||
|
tx = y + 2 * self.edges.get('F').spacing()
|
||||||
|
ty = h + self.edges.get('f').spacing() + self.edges.get("e").spacing()
|
||||||
|
|
||||||
|
if self.move(tx, ty, move, before=True):
|
||||||
|
return
|
||||||
|
|
||||||
|
lf = math.sqrt((h-hf)**2+(y-yg-tf)**2)
|
||||||
|
af = 90-math.degrees(math.atan((h-hf)/(y-yg-tf)))
|
||||||
|
|
||||||
|
atemp = math.degrees(math.atan((h-hf-r)/(y-yg-tf)))
|
||||||
|
dtemp = math.sqrt((h-hf-r)**2+(y-yg-tf)**2)
|
||||||
|
lf = math.sqrt(dtemp**2-r**2)
|
||||||
|
af = 90-atemp-math.degrees(math.atan(r/lf))
|
||||||
|
|
||||||
|
self.moveTo(self.edges.get('f').margin(), self.edges.get("f").margin())
|
||||||
|
|
||||||
|
self.edges.get('f')(y)
|
||||||
|
self.edgeCorner(self.edges["f"],self.edges["F"],90)
|
||||||
|
self.edges.get('F')(hf)
|
||||||
|
self.edgeCorner(self.edges["F"],self.edges["f"],90)
|
||||||
|
self.edges.get('f')(tf)
|
||||||
|
self.corner(af-90,r)
|
||||||
|
self.edges.get('f')(lf)
|
||||||
|
self.edgeCorner(self.edges["f"],self.edges["e"],90-af)
|
||||||
|
self.edges.get('e')(yg)
|
||||||
|
self.edgeCorner(self.edges["e"],self.edges["F"],90)
|
||||||
|
self.edges.get('F')(h)
|
||||||
|
self.edgeCorner(self.edges["F"],self.edges["f"],90)
|
||||||
|
|
||||||
|
self.move(tx, ty, move, label=label)
|
||||||
|
|
||||||
|
return lf,math.radians(90-af)
|
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
|
@ -140,3 +140,4 @@ e9ee43e336401d3a0cb8e141c3a0b87a84e90f99eed30bdd420dcaead92940e1 ../static/samp
|
||||||
c8adb0661956430ccec7fc00aa4b8e3c42d02083e17a9307541bc0160251cb96 ../static/samples/HolePattern.jpg
|
c8adb0661956430ccec7fc00aa4b8e3c42d02083e17a9307541bc0160251cb96 ../static/samples/HolePattern.jpg
|
||||||
7c399c1cd235c3c044f676a31aa5215109e815055f2f69aef5d0cb1a24dfae41 ../static/samples/Desksign.jpg
|
7c399c1cd235c3c044f676a31aa5215109e815055f2f69aef5d0cb1a24dfae41 ../static/samples/Desksign.jpg
|
||||||
fda14ba0920ef7ea0579117a30b5bb4a05ab3be4da3d87a4fc03fc40b085992b ../static/samples/PirateChest.jpg
|
fda14ba0920ef7ea0579117a30b5bb4a05ab3be4da3d87a4fc03fc40b085992b ../static/samples/PirateChest.jpg
|
||||||
|
125033a02263e74d5688287936f54cd83e917276b7c35f3fd37e6cb86efc0dcc ../static/samples/Shoe.jpg
|
||||||
|
|
Loading…
Reference in New Issue