edges: code style
This commit is contained in:
parent
7cdb8749bf
commit
2a044e7829
|
@ -57,6 +57,7 @@ def argparseSections(s):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def getDescriptions():
|
def getDescriptions():
|
||||||
d = {edge.char: edge.description for edge in globals().values()
|
d = {edge.char: edge.description for edge in globals().values()
|
||||||
if inspect.isclass(edge) and issubclass(edge, BaseEdge)
|
if inspect.isclass(edge) and issubclass(edge, BaseEdge)
|
||||||
|
@ -285,6 +286,7 @@ class Settings:
|
||||||
return self.values[name]
|
return self.values[name]
|
||||||
raise AttributeError
|
raise AttributeError
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
### Edges
|
### Edges
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -367,6 +369,7 @@ class OutSetEdge(Edge):
|
||||||
def startwidth(self):
|
def startwidth(self):
|
||||||
return self.boxes.thickness
|
return self.boxes.thickness
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### MountingEdge
|
#### MountingEdge
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -544,7 +547,6 @@ class GroovedEdgeBase(BaseEdge):
|
||||||
def is_inverse(self):
|
def is_inverse(self):
|
||||||
return self.settings.inverse != self.inverse
|
return self.settings.inverse != self.inverse
|
||||||
|
|
||||||
|
|
||||||
def groove_arc(self, width, angle=90, inv=-1.0):
|
def groove_arc(self, width, angle=90, inv=-1.0):
|
||||||
side_length = width / math.sin(math.radians(angle)) / 2
|
side_length = width / math.sin(math.radians(angle)) / 2
|
||||||
self.corner(inv * -angle)
|
self.corner(inv * -angle)
|
||||||
|
@ -552,7 +554,6 @@ class GroovedEdgeBase(BaseEdge):
|
||||||
self.corner(inv * angle, side_length)
|
self.corner(inv * angle, side_length)
|
||||||
self.corner(inv * -angle)
|
self.corner(inv * -angle)
|
||||||
|
|
||||||
|
|
||||||
def groove_soft_arc(self, width, angle=60, inv=-1.0):
|
def groove_soft_arc(self, width, angle=60, inv=-1.0):
|
||||||
side_length = width / math.sin(math.radians(angle)) / 4
|
side_length = width / math.sin(math.radians(angle)) / 4
|
||||||
self.corner(inv * -angle, side_length)
|
self.corner(inv * -angle, side_length)
|
||||||
|
@ -560,7 +561,6 @@ class GroovedEdgeBase(BaseEdge):
|
||||||
self.corner(inv * angle, side_length)
|
self.corner(inv * angle, side_length)
|
||||||
self.corner(inv * -angle, side_length)
|
self.corner(inv * -angle, side_length)
|
||||||
|
|
||||||
|
|
||||||
def groove_triangle(self, width, angle=45, inv=-1.0):
|
def groove_triangle(self, width, angle=45, inv=-1.0):
|
||||||
side_length = width / math.cos(math.radians(angle)) / 2
|
side_length = width / math.cos(math.radians(angle)) / 2
|
||||||
self.corner(inv * -angle)
|
self.corner(inv * -angle)
|
||||||
|
@ -569,7 +569,6 @@ class GroovedEdgeBase(BaseEdge):
|
||||||
self.edge(side_length)
|
self.edge(side_length)
|
||||||
self.corner(inv * -angle)
|
self.corner(inv * -angle)
|
||||||
|
|
||||||
|
|
||||||
def __call__(self, length, **kw):
|
def __call__(self, length, **kw):
|
||||||
if length == 0.0:
|
if length == 0.0:
|
||||||
return
|
return
|
||||||
|
@ -674,6 +673,7 @@ Values:
|
||||||
edges = [GrippingEdge(boxes, self)]
|
edges = [GrippingEdge(boxes, self)]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class GrippingEdge(BaseEdge):
|
class GrippingEdge(BaseEdge):
|
||||||
description = """Corrugated edge useful as an gipping area"""
|
description = """Corrugated edge useful as an gipping area"""
|
||||||
char = 'g'
|
char = 'g'
|
||||||
|
@ -867,6 +867,7 @@ Values:
|
||||||
]
|
]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class FingerJointBase:
|
class FingerJointBase:
|
||||||
|
|
||||||
def calcFingers(self, length, bedBolts):
|
def calcFingers(self, length, bedBolts):
|
||||||
|
@ -905,6 +906,7 @@ class FingerJointBase:
|
||||||
spacerecess = -math.sin(math.radians(b)) * fingerlength
|
spacerecess = -math.sin(math.radians(b)) * fingerlength
|
||||||
return fingerlength + self.settings.extra_length, spacerecess
|
return fingerlength + self.settings.extra_length, spacerecess
|
||||||
|
|
||||||
|
|
||||||
class FingerJointEdge(BaseEdge, FingerJointBase):
|
class FingerJointEdge(BaseEdge, FingerJointBase):
|
||||||
"""Finger joint edge """
|
"""Finger joint edge """
|
||||||
char = 'f'
|
char = 'f'
|
||||||
|
@ -1063,6 +1065,7 @@ class FingerHoles(FingerJointBase):
|
||||||
self.boxes.rectangularHole(pos + 0.5 * f, 0,
|
self.boxes.rectangularHole(pos + 0.5 * f, 0,
|
||||||
f + p, self.settings.width + p)
|
f + p, self.settings.width + p)
|
||||||
|
|
||||||
|
|
||||||
class FingerHoleEdge(BaseEdge):
|
class FingerHoleEdge(BaseEdge):
|
||||||
"""Edge with holes for a parallel finger joint"""
|
"""Edge with holes for a parallel finger joint"""
|
||||||
char = 'h'
|
char = 'h'
|
||||||
|
@ -1101,6 +1104,7 @@ class FingerHoleEdge(BaseEdge):
|
||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
class CrossingFingerHoleEdge(Edge):
|
class CrossingFingerHoleEdge(Edge):
|
||||||
"""Edge with holes for finger joints 90° above"""
|
"""Edge with holes for finger joints 90° above"""
|
||||||
|
|
||||||
|
@ -1121,6 +1125,7 @@ class CrossingFingerHoleEdge(Edge):
|
||||||
def startwidth(self):
|
def startwidth(self):
|
||||||
return self.outset
|
return self.outset
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Stackable Joints
|
#### Stackable Joints
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -1169,6 +1174,7 @@ Values:
|
||||||
]
|
]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class StackableBaseEdge(BaseEdge):
|
class StackableBaseEdge(BaseEdge):
|
||||||
"""Edge for having stackable Boxes. The Edge creates feet on the bottom
|
"""Edge for having stackable Boxes. The Edge creates feet on the bottom
|
||||||
and has matching recesses on the top corners."""
|
and has matching recesses on the top corners."""
|
||||||
|
@ -1218,6 +1224,7 @@ class StackableBaseEdge(BaseEdge):
|
||||||
else:
|
else:
|
||||||
return self.settings.height
|
return self.settings.height
|
||||||
|
|
||||||
|
|
||||||
class StackableEdge(StackableBaseEdge):
|
class StackableEdge(StackableBaseEdge):
|
||||||
"""Edge for having stackable Boxes. The Edge creates feet on the bottom
|
"""Edge for having stackable Boxes. The Edge creates feet on the bottom
|
||||||
and has matching recesses on the top corners."""
|
and has matching recesses on the top corners."""
|
||||||
|
@ -1233,11 +1240,13 @@ class StackableEdge(StackableBaseEdge):
|
||||||
length, 0)
|
length, 0)
|
||||||
super().__call__(length, **kw)
|
super().__call__(length, **kw)
|
||||||
|
|
||||||
|
|
||||||
class StackableEdgeTop(StackableBaseEdge):
|
class StackableEdgeTop(StackableBaseEdge):
|
||||||
char = "S"
|
char = "S"
|
||||||
description = "Stackable (top)"
|
description = "Stackable (top)"
|
||||||
bottom = False
|
bottom = False
|
||||||
|
|
||||||
|
|
||||||
class StackableFeet(StackableBaseEdge):
|
class StackableFeet(StackableBaseEdge):
|
||||||
char = "š"
|
char = "š"
|
||||||
description = "Stackable feet (bottom)"
|
description = "Stackable feet (bottom)"
|
||||||
|
@ -1245,6 +1254,7 @@ class StackableFeet(StackableBaseEdge):
|
||||||
def _height(self):
|
def _height(self):
|
||||||
return self.settings.height
|
return self.settings.height
|
||||||
|
|
||||||
|
|
||||||
class StackableHoleEdgeTop(StackableBaseEdge):
|
class StackableHoleEdgeTop(StackableBaseEdge):
|
||||||
char = "Š"
|
char = "Š"
|
||||||
description = "Stackable edge with finger holes (top)"
|
description = "Stackable edge with finger holes (top)"
|
||||||
|
@ -1261,6 +1271,7 @@ class StackableHoleEdgeTop(StackableBaseEdge):
|
||||||
length, 0)
|
length, 0)
|
||||||
super().__call__(length, **kw)
|
super().__call__(length, **kw)
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Hinges
|
#### Hinges
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -1311,6 +1322,7 @@ Values:
|
||||||
]
|
]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class Hinge(BaseEdge):
|
class Hinge(BaseEdge):
|
||||||
char = 'i'
|
char = 'i'
|
||||||
description = "Straight edge with hinge eye"
|
description = "Straight edge with hinge eye"
|
||||||
|
@ -1526,6 +1538,7 @@ class HingePin(BaseEdge):
|
||||||
self.edge(l - plen - glen, tabs=2)
|
self.edge(l - plen - glen, tabs=2)
|
||||||
getattr(self, self.settings.style, self.outset)(True)
|
getattr(self, self.settings.style, self.outset)(True)
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Chest Hinge
|
#### Chest Hinge
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -1574,8 +1587,8 @@ Values:
|
||||||
]
|
]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
class ChestHinge(BaseEdge):
|
|
||||||
|
|
||||||
|
class ChestHinge(BaseEdge):
|
||||||
description = "Edge with chest hinge"
|
description = "Edge with chest hinge"
|
||||||
|
|
||||||
char = "o"
|
char = "o"
|
||||||
|
@ -1631,6 +1644,7 @@ class ChestHinge(BaseEdge):
|
||||||
return 0
|
return 0
|
||||||
return self.settings.pin_height + self.settings.hinge_strength
|
return self.settings.pin_height + self.settings.hinge_strength
|
||||||
|
|
||||||
|
|
||||||
class ChestHingeTop(ChestHinge):
|
class ChestHingeTop(ChestHinge):
|
||||||
"""Edge above a chest hinge"""
|
"""Edge above a chest hinge"""
|
||||||
|
|
||||||
|
@ -1681,8 +1695,8 @@ class ChestHingeTop(ChestHinge):
|
||||||
else:
|
else:
|
||||||
return 1 * (self.settings.play + self.settings.pin_height + self.settings.hinge_strength)
|
return 1 * (self.settings.play + self.settings.pin_height + self.settings.hinge_strength)
|
||||||
|
|
||||||
class ChestHingePin(BaseEdge):
|
|
||||||
|
|
||||||
|
class ChestHingePin(BaseEdge):
|
||||||
description = "Edge with pins for an chest hinge"
|
description = "Edge with pins for an chest hinge"
|
||||||
|
|
||||||
char = "q"
|
char = "q"
|
||||||
|
@ -1710,7 +1724,6 @@ class ChestHingePin(BaseEdge):
|
||||||
|
|
||||||
|
|
||||||
class ChestHingeFront(Edge):
|
class ChestHingeFront(Edge):
|
||||||
|
|
||||||
description = "Edge opposing a chest hinge"
|
description = "Edge opposing a chest hinge"
|
||||||
|
|
||||||
char = "Q"
|
char = "Q"
|
||||||
|
@ -1718,6 +1731,7 @@ class ChestHingeFront(Edge):
|
||||||
def startwidth(self):
|
def startwidth(self):
|
||||||
return self.settings.pin_height + self.settings.hinge_strength
|
return self.settings.pin_height + self.settings.hinge_strength
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Cabinet Hinge
|
#### Cabinet Hinge
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -1762,6 +1776,7 @@ Values:
|
||||||
e.char = c
|
e.char = c
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class CabinetHingeEdge(BaseEdge):
|
class CabinetHingeEdge(BaseEdge):
|
||||||
"""Edge with cabinet hinges"""
|
"""Edge with cabinet hinges"""
|
||||||
|
|
||||||
|
@ -1777,7 +1792,6 @@ class CabinetHingeEdge(BaseEdge):
|
||||||
def startwidth(self):
|
def startwidth(self):
|
||||||
return self.settings.thickness if self.top and self.angled else 0.0
|
return self.settings.thickness if self.top and self.angled else 0.0
|
||||||
|
|
||||||
|
|
||||||
def __poly(self):
|
def __poly(self):
|
||||||
n = self.settings.eyes_per_hinge
|
n = self.settings.eyes_per_hinge
|
||||||
p = self.settings.play
|
p = self.settings.play
|
||||||
|
@ -1909,6 +1923,7 @@ class CabinetHingeEdge(BaseEdge):
|
||||||
|
|
||||||
self.move(th, tw, move, label="hinges")
|
self.move(th, tw, move, label="hinges")
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Slide-on lid
|
#### Slide-on lid
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -1953,6 +1968,7 @@ Values:
|
||||||
]
|
]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class LidEdge(FingerJointEdge):
|
class LidEdge(FingerJointEdge):
|
||||||
char = "l"
|
char = "l"
|
||||||
description = "Edge for slide on lid (back)"
|
description = "Edge for slide on lid (back)"
|
||||||
|
@ -1966,6 +1982,7 @@ class LidEdge(FingerJointEdge):
|
||||||
else:
|
else:
|
||||||
super().__call__(length)
|
super().__call__(length)
|
||||||
|
|
||||||
|
|
||||||
class LidHoleEdge(FingerHoleEdge):
|
class LidHoleEdge(FingerHoleEdge):
|
||||||
char = "L"
|
char = "L"
|
||||||
description = "Edge for slide on lid (box back)"
|
description = "Edge for slide on lid (box back)"
|
||||||
|
@ -1979,6 +1996,7 @@ class LidHoleEdge(FingerHoleEdge):
|
||||||
else:
|
else:
|
||||||
super().__call__(length)
|
super().__call__(length)
|
||||||
|
|
||||||
|
|
||||||
class LidRight(BaseEdge):
|
class LidRight(BaseEdge):
|
||||||
char = "n"
|
char = "n"
|
||||||
description = "Edge for slide on lid (right)"
|
description = "Edge for slide on lid (right)"
|
||||||
|
@ -2029,11 +2047,13 @@ class LidRight(BaseEdge):
|
||||||
else:
|
else:
|
||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
|
|
||||||
class LidLeft(LidRight):
|
class LidLeft(LidRight):
|
||||||
char = "m"
|
char = "m"
|
||||||
description = "Edge for slide on lid (left)"
|
description = "Edge for slide on lid (left)"
|
||||||
rightside = False
|
rightside = False
|
||||||
|
|
||||||
|
|
||||||
class LidSideRight(BaseEdge):
|
class LidSideRight(BaseEdge):
|
||||||
char = "N"
|
char = "N"
|
||||||
description = "Edge for slide on lid (box right)"
|
description = "Edge for slide on lid (box right)"
|
||||||
|
@ -2082,11 +2102,13 @@ class LidSideRight(BaseEdge):
|
||||||
def margin(self):
|
def margin(self):
|
||||||
return self.boxes.thickness + self.settings.edge_width + self.settings.play / 2 if not self.rightside else 0.0
|
return self.boxes.thickness + self.settings.edge_width + self.settings.play / 2 if not self.rightside else 0.0
|
||||||
|
|
||||||
|
|
||||||
class LidSideLeft(LidSideRight):
|
class LidSideLeft(LidSideRight):
|
||||||
char = "M"
|
char = "M"
|
||||||
description = "Edge for slide on lid (box left)"
|
description = "Edge for slide on lid (box left)"
|
||||||
rightside = False
|
rightside = False
|
||||||
|
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#### Click Joints
|
#### Click Joints
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
@ -2119,6 +2141,7 @@ Values:
|
||||||
ClickEdge(boxes, self)]
|
ClickEdge(boxes, self)]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class ClickConnector(BaseEdge):
|
class ClickConnector(BaseEdge):
|
||||||
char = "c"
|
char = "c"
|
||||||
description = "Click on (bottom side)"
|
description = "Click on (bottom side)"
|
||||||
|
@ -2266,6 +2289,7 @@ Values:
|
||||||
DoveTailJointCounterPart(boxes, self)]
|
DoveTailJointCounterPart(boxes, self)]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class DoveTailJoint(BaseEdge):
|
class DoveTailJoint(BaseEdge):
|
||||||
"""Edge with dove tail joints """
|
"""Edge with dove tail joints """
|
||||||
|
|
||||||
|
@ -2357,6 +2381,7 @@ Values:
|
||||||
if self.width < 0.1:
|
if self.width < 0.1:
|
||||||
raise ValueError("Flex Settings: width parameter must be > 0.1mm")
|
raise ValueError("Flex Settings: width parameter must be > 0.1mm")
|
||||||
|
|
||||||
|
|
||||||
class FlexEdge(BaseEdge):
|
class FlexEdge(BaseEdge):
|
||||||
"""Edge with flex cuts - use straight edge for the opposing side"""
|
"""Edge with flex cuts - use straight edge for the opposing side"""
|
||||||
char = 'X'
|
char = 'X'
|
||||||
|
@ -2411,6 +2436,7 @@ class FlexEdge(BaseEdge):
|
||||||
self.ctx.line_to(x, 0)
|
self.ctx.line_to(x, 0)
|
||||||
self.ctx.translate(*self.ctx.get_current_point())
|
self.ctx.translate(*self.ctx.get_current_point())
|
||||||
|
|
||||||
|
|
||||||
class GearSettings(Settings):
|
class GearSettings(Settings):
|
||||||
"""Settings for rack (and pinion) edge
|
"""Settings for rack (and pinion) edge
|
||||||
Values:
|
Values:
|
||||||
|
@ -2431,8 +2457,8 @@ Values:
|
||||||
|
|
||||||
relative_params = {}
|
relative_params = {}
|
||||||
|
|
||||||
class RackEdge(BaseEdge):
|
|
||||||
|
|
||||||
|
class RackEdge(BaseEdge):
|
||||||
char = "R"
|
char = "R"
|
||||||
|
|
||||||
description = "Rack (and pinion) Edge"
|
description = "Rack (and pinion) Edge"
|
||||||
|
@ -2457,6 +2483,7 @@ class RackEdge(BaseEdge):
|
||||||
def margin(self):
|
def margin(self):
|
||||||
return self.settings.dimension * 1.1
|
return self.settings.dimension * 1.1
|
||||||
|
|
||||||
|
|
||||||
class RoundedTriangleEdgeSettings(Settings):
|
class RoundedTriangleEdgeSettings(Settings):
|
||||||
"""Settings for RoundedTriangleEdge
|
"""Settings for RoundedTriangleEdge
|
||||||
Values:
|
Values:
|
||||||
|
@ -2488,11 +2515,13 @@ Values:
|
||||||
RoundedTriangleFingerHolesEdge(boxes, self)]
|
RoundedTriangleFingerHolesEdge(boxes, self)]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
class RoundedTriangleEdge(Edge):
|
class RoundedTriangleEdge(Edge):
|
||||||
"""Makes an 'edge' with a rounded triangular bumpout and
|
"""Makes an 'edge' with a rounded triangular bumpout and
|
||||||
optional hole"""
|
optional hole"""
|
||||||
description = "Triangle for handle"
|
description = "Triangle for handle"
|
||||||
char = "t"
|
char = "t"
|
||||||
|
|
||||||
def __call__(self, length, **kw):
|
def __call__(self, length, **kw):
|
||||||
length += 2 * self.settings.outset
|
length += 2 * self.settings.outset
|
||||||
r = self.settings.radius
|
r = self.settings.radius
|
||||||
|
@ -2525,8 +2554,8 @@ class RoundedTriangleEdge(Edge):
|
||||||
def margin(self):
|
def margin(self):
|
||||||
return self.settings.height + self.settings.radius
|
return self.settings.height + self.settings.radius
|
||||||
|
|
||||||
class RoundedTriangleFingerHolesEdge(RoundedTriangleEdge):
|
|
||||||
|
|
||||||
|
class RoundedTriangleFingerHolesEdge(RoundedTriangleEdge):
|
||||||
char = "T"
|
char = "T"
|
||||||
|
|
||||||
def startwidth(self):
|
def startwidth(self):
|
||||||
|
@ -2572,6 +2601,7 @@ Values:
|
||||||
HandleHoleEdge(boxes, self)]
|
HandleHoleEdge(boxes, self)]
|
||||||
return self._edgeObjects(edges, boxes, chars, add)
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
# inspiration came from https://www.thingiverse.com/thing:327393
|
# inspiration came from https://www.thingiverse.com/thing:327393
|
||||||
|
|
||||||
class HandleEdge(Edge):
|
class HandleEdge(Edge):
|
||||||
|
@ -2631,6 +2661,7 @@ class HandleEdge(Edge):
|
||||||
def margin(self):
|
def margin(self):
|
||||||
return self.settings.height
|
return self.settings.height
|
||||||
|
|
||||||
|
|
||||||
class HandleHoleEdge(HandleEdge):
|
class HandleHoleEdge(HandleEdge):
|
||||||
"""Extends an 'edge' by adding a rounded bumpout with optional holes and holes for parallel finger joint"""
|
"""Extends an 'edge' by adding a rounded bumpout with optional holes and holes for parallel finger joint"""
|
||||||
description = "Handle with holes for parallel finger joint"
|
description = "Handle with holes for parallel finger joint"
|
||||||
|
|
Loading…
Reference in New Issue