Open-end spanner

An open-end spanner turns a nut of 13 across its flats. Its jaw is turned 15° to the handle, so that the spanner, turned over, reaches the nut again in a tight space after a turn of 30°. As faces, the spanner is a head and a handle united, less the jaw and a hole to hang it by, with fillets where the handle meets the head. Model the spanner from the drawing in planex2d or in any CAD system, then check its area and centroid against the values at the end of the page. A solution in planex2d follows.

The open-end spanner exercise: a dimensioned drawing of a spanner with a round head, a jaw at 15 degrees to the handle and a hole at the handle's end

[1]:
import math
import planex as px

The head and the handle

The head is a disc of radius 16 around the jaw’s center, the origin. The handle is a Slot 110 long between the centers of its ends and 14 wide, from the origin along x, so that its far end is rounded with a radius of 7. px.Unify unites the two into one region (Figure 1):

[3]:
head = px.Circle((0, 0), 16).Face()
handle = px.QuickSketch().Slot(110, 14).Face()
body = px.Unify([head, handle])
The head and the handle
(a) The head and the handle
United
(b) United
Figure 1: The head and the handle

The jaw and the hole

The jaw is a slot 13 wide, the nut’s width across its flats, from the jaw’s center out through the head, turned 15° from the handle’s axis. It points along 180° + 15°, and its round end at the center makes the bottom of the jaw. The hole to hang the spanner by, 6 across, is at the center of the handle’s end. Both are subtracted with - (Figure 2):

[5]:
t = math.radians(180 + 15)
jaw = px.QuickSketch().Move((0, 0), dir=(math.cos(t), math.sin(t))).Slot(30, 13).Face()
hole = px.Circle((110, 0), 6 / 2).Face()
spanner = (body - jaw - hole).Face()  # the one face of what is left
The jaw and the hole on the body
(a) The jaw and the hole on the body
Subtracted
(b) Subtracted
Figure 2: The jaw and the hole

The fillets

The corners where the handle’s edges meet the head are rounded with a radius of 8. vertices(near=) picks the corner nearest to a point, so the two are given roughly, and Fillet rounds just these two (Figure 3):

[7]:
corners = [spanner.vertices(near=(15, 7)), spanner.vertices(near=(15, -7))]
spanner.Fillet(corners, 8);
The spanner with its two fillets
Figure 3: The fillets

The checks

These are the area and the centroid of the spanner, with the jaw’s center at the origin and the handle along x, to compare with your own model (Figure 4):

[9]:
c = spanner.center
print("area", round(spanner.mass, 2), "mm²")
print("centroid", tuple(round(v, 2) for v in c[:2]))
area 1913.03 mm²
centroid (47.06, 0.19)
The spanner, its centroid marked
Figure 4: The spanner

The spanner as DXF in millimeters, for another CAD system or a laser cutter:

[11]:
spanner.WriteDXF("open_end_spanner.dxf", unit=px.mm, scale=1)  # scale=1: the numbers as they are

The spanner as DXF: open_end_spanner.dxf