RoundedBox: Allow arbirtary horizontal layers

by changing h param to sh.

Also surroundingWallPiece to get the dimmensions of each section in the
surrounding wall.

Resolves: #339

Thanks to Florin Furdi for the idea!
This commit is contained in:
Florian Festi 2021-12-17 21:27:06 +01:00
parent ff6a2b955a
commit d5654137a4
2 changed files with 53 additions and 4 deletions

View File

@ -1689,6 +1689,42 @@ class Boxes:
self.move(overallwidth, overallheight, move)
def surroundingWallPiece(self, cbnr, x, y, r, pieces=1):
"""
Return the geometry of a pices of surroundingWall with the given
callback number.
:param cbnr: number of the callback corresponding to
this part of the wall
:param x: width of matching roundedPlate
:param y: height of matching roundedPlate
:param r: corner radius of matching roundedPlate
:param pieces: (Default value = 1) number of separate pieces
:return: (left, length, right) left and right are Booleans that are
True if the start or end of the wall is on that side.
"""
if pieces<=2 and (y - 2 * r) < 1E-3:
# remove zero length y sides
sides = (x/2-r, x - 2*r, x - 2*r)
if pieces > 0: # hack to get the right splits
pieces += 1
else:
sides = (x/2-r, y - 2*r, x - 2*r, y - 2*r, x - 2*r)
wallcount = 0
for nr, l in enumerate(sides):
if self._splitWall(pieces, nr) and nr > 0:
if wallcount == cbnr:
return (False, l/2, True)
wallcount += 1
if wallcount == cbnr:
return (True, l/2, False)
wallcount += 1
else:
if wallcount == cbnr:
return (False, l, False)
wallcount += 1
return (False, 0.0, False)
def surroundingWall(self, x, y, r, h,
bottom='e', top='e',
left="D", right="d",

View File

@ -36,7 +36,7 @@ With lid:
boxes.Boxes.__init__(self)
self.addSettingsArgs(boxes.edges.FingerJointSettings)
self.addSettingsArgs(boxes.edges.FlexSettings)
self.buildArgParser("x", "y", "h", "outside")
self.buildArgParser("x", "y", "outside", sh="100.0")
self.argparser.add_argument(
"--radius", action="store", type=float, default=15,
help="Radius of the corners in mm")
@ -77,19 +77,28 @@ With lid:
self.edge(l);
self.corner(90, r)
def cb(self, nr):
h = 0.5 * self.thickness
left, l, right = self.surroundingWallPiece(nr, self.x, self.y, self.radius, self.wallpieces)
for dh in self.sh[:-1]:
h += dh
self.fingerHolesAt(0, h, l, 0)
def render(self):
x, y, h, r = self.x, self.y, self.h, self.radius
x, y, sh, r = self.x, self.y, self.sh, self.radius
if self.outside:
self.x = x = self.adjustSize(x)
self.y = y = self.adjustSize(y)
self.h = h = self.adjustSize(h)
self.sh = sh = self.adjustSize(sh)
r = self.radius = min(r, y / 2.0)
t = self.thickness
h = sum(sh) + t * (len(sh) - 1)
es = self.edge_style
corner_holes = True
@ -107,6 +116,9 @@ With lid:
with self.saved_context():
self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces,
extend_corners=ec, move="right")
for dh in self.sh[:-1]:
self.roundedPlate(x, y, r, "f", wallpieces=self.wallpieces,
extend_corners=False, move="right")
self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces,
extend_corners=ec, move="right",
callback=[self.hole] if self.top != "closed" else None)
@ -120,6 +132,7 @@ With lid:
self.roundedPlate(x, y, r, es, wallpieces=self.wallpieces, move="up only")
self.surroundingWall(x, y, r, h, pe, pe, pieces=self.wallpieces)
self.surroundingWall(x, y, r, h, pe, pe, pieces=self.wallpieces,
callback=self.cb)