Here is an example using BoxSelector to help select the edges for fillet.
>general feedback
For multiple feet consider Workplane each (or maybe mirror) or Sketch each. Here is an example using Sketch.
```py
import cadquery as cq
w, l, h = 50, 100, 20
hfoot = 4
box = cq.Workplane("XY").rect(w, l).extrude(h)
# feet
sk0 = (
cq.Sketch()
.push([(5, 0)])
.rect(10, 10, tag="rect")
.reset()
.vertices(">X")
.fillet(2) # issue with fillet after hole, move before hole
.segment((0, 0), (6, 0), tag="hole", forConstruction=True)
.vertices(">X", tag="hole")
.circle(1.5, mode="s")
.clean()
)
# manually locate feet
# sketches_feet = [
# sk0.moved(cq.Location((w / 2, l / 2 - 20, 0), (0, 0, 1), 0)),
# sk0.moved(cq.Location((w / 2, -l / 2 + 20, 0), (0, 0, 1), 0)),
# sk0.moved(cq.Location((-w / 2, l / 2 - 20, 0), (0, 0, 1), 180)),
# sk0.moved(cq.Location((-w / 2, -l / 2 + 20, 0), (0, 0, 1), 180)),
# sk0.moved(cq.Location((0, l / 2, 0), (0, 0, 1), 90)),
# sk0.moved(cq.Location((0, -l / 2, 0), (0, 0, 1), 270)),
# ]
# or selecting box edges for foot placement
sketches_feet = [
# two feet on long edges, one on short edges
(
cq.Sketch()
.edge(box.edges("<Z and >X").val())
.edges()
.distribute(2, 0.2, 0.8, rotate=False)
.each(lambda loc: sk0.moved(loc))
),
(
cq.Sketch()
.edge(box.edges("<Z and <X").val())
.edges()
.distribute(2, 0.2, 0.8, rotate=False)
.each(lambda loc: sk0.moved(loc * cq.Location((0, 0, 0), (0, 0, 1), 180)))
),
(
cq.Sketch()
.edge(box.edges("<Z and >Y").val())
.edges()
.each(lambda loc: sk0.moved(loc * cq.Location((0, 0, 0), (0, 0, 1), 90)))
),
(
cq.Sketch()
.edge(box.edges("<Z and <Y").val())
.edges()
.each(lambda loc: sk0.moved(loc * cq.Location((0, 0, 0), (0, 0, 1), 270)))
),
]
feet = cq.Workplane().placeSketch(*sketches_feet).extrude(hfoot)
res = box.union(feet)
# fillet box-foot
eps = 1e-3
res = (
res.edges(
cq.selectors.BoxSelector(
(-(w + eps) / 2, -(l + eps) / 2, hfoot - eps),
((w + eps) / 2, (l + eps) / 2, hfoot + eps),
)
)
.edges("|X or |Y")
.fillet(3)
)
```