Gear pump housing

The housing of the gear pump holds the two gears in their chambers. The gasket seals it, and the cover closes it. The chambers are the gasket’s opening pocketed to the gears’ width, the tapped holes for the cover’s screws lie on the gasket’s bolt line, and the oil comes in and goes out through two ports drilled from the sides into the chambers, where the gears mesh. Model the housing from the drawing in planex2d or in any CAD system. Then check that its cavity is one passage, and compare its volume, mass and center of mass with the values at the end of the page. A solution in planex2d follows.

The gear pump housing exercise: a dimensioned drawing of a block with two overlapping gear chambers, bearing bores, tapped holes around the chambers, mounting holes and a port on each side, in a top view, a full section, a side view and an isometric

[1]:
import math
import netgen.occ as occ
import planex as px

The block

The block is 130 by 90 and 30 high, with its corners rounded to a radius of 10. It is a RectangleC around the origin on the xy plane, filleted at its corners and padded 30 up. Its top, at \(z = 30\), is the face the gasket and the cover sit on, and the gears’ centers lie 17 to either side of the origin on the \(x\) axis (Figure 1):

[3]:
outline = px.Sketch(auto_constraint=True)
outline.RectangleC(130, 90, id="block")
outline.Constrain("block.center", "origin", px.Coincident)
outline.Constrain("block.Line.1", px.Horizontal)
outline.Constrain("block.Line.1", px.Distance, 130, id="length")
outline.Constrain("block.Line.2", px.Distance, 90, id="width")
outline.Fillet(["block.Line.1.start", "block.Line.2.start", "block.Line.3.start", "block.Line.4.start"], 10,
               id=["corner_1", "corner_2", "corner_3", "corner_4"])
print("status", outline.status, "| degrees of freedom", outline.dof)
housing = px.Pad(outline, 30)
status full | degrees of freedom 0
The block's outline, every dimension and tie
(a) The block's outline, every dimension and tie
Padded 30
(b) Padded 30
Figure 1: The block

The chambers and the bearings

The chambers are the gasket’s opening, two circles of 38.5 around the gears’ centers, united and pocketed 20 deep from the top, the rotors’ width. That leaves 10 of wall below them. The gears’ shafts run in two bearing bores of 15, 8 deep into that wall, sketched on the chambers’ floor, the xy plane lifted to 10 (Figure 2):

[5]:
opening = px.Unify([px.Circle((-17, 0), 38.5 / 2).Face(), px.Circle((17, 0), 38.5 / 2).Face()]).Face()
housing = px.Pocket(housing, opening.Translated((0, 0, 30)), 20)
bearings = px.QuickSketch(px.Plane(px.XY, 10)).Circle(15 / 2, center=(-17, 0)).Circle(15 / 2, center=(17, 0))
housing = px.Pocket(housing, bearings, 8)
The chambers and the bearing bores
Figure 2: The chambers and the bearings

The holes

The cover’s ten M6 screws go into tapped holes where the gasket’s holes are. They are equally spaced along the bolt line, the opening offset by 8, the first half a pitch from its start. along walks the bolt line as on the cover’s page, and each hole is the tapping drill of 5, 15 deep. The housing is bolted down through four holes of 9 through its corners, 110 by 70 apart (Figure 3):

[7]:
def along(wire, n):
    """n points equally spaced along a closed wire, the first half a pitch from its start"""
    pitch = wire.mass / n
    targets = [pitch / 2 + k * pitch for k in range(n)]
    points, walked = [], 0.0
    for e in wire.edges:
        length = e.Measure()["length"]
        points += [e.PointAt((t - walked) / length) for t in targets if walked <= t < walked + length]
        walked += length
    return [(p.x, p.y) for p in points]


bolt_line = opening.Offset(8, inplace=False).Face().outer
tapped = px.QuickSketch(px.Plane(px.XY, 30))
for c in along(bolt_line, 10):
    tapped.Circle(5 / 2, center=c)
housing = px.Pocket(housing, tapped, 15)
mounting = px.QuickSketch(px.Plane(px.XY, 30))
for x in (-55, 55):
    for y in (-35, 35):
        mounting.Circle(9 / 2, center=(x, y))
housing = px.Pocket(housing, mounting, until=px.last)  # through the block
The tapped holes and the mounting holes
Figure 3: The holes

The ports

The inlet and the outlet are drilled from the block’s two long sides at \(x = 0\), where the chambers meet and the gears mesh, in the middle of the chambers’ depth, 20 above the bottom. Each has a spot face of 22, 1 deep, for the fitting’s seal, and a bore of 12, 38 deep, into the chambers. A sketch on a side face has its own axes, and ToHV gives the port’s center, a 3D point, in them (Figure 4):

[9]:
for side in (housing.faces.Min(occ.Y), housing.faces.Max(occ.Y)):
    center = (0, side.center.y, 20)
    spot = px.QuickSketch(side)
    spot.Circle(22 / 2, center=spot.ToHV(center))
    housing = px.Pocket(housing, spot, 1)
    port = px.QuickSketch(side)
    port.Circle(12 / 2, center=port.ToHV(center))
    housing = px.Pocket(housing, port, 38)
The ports from the sides into the chambers
Figure 4: The ports

The checks

The cavity is what is taken out of the block, the block less the housing. Its pieces are the solids of that difference, and the chambers, the bearing bores and the two ports must form one of them, with the ten tapped holes and the four mounting holes apart. Then come the volume, the mass in aluminum EN AC-AlSi10Mg (2.68 g/cm³) and the center of mass, with the origin in the middle of the bottom, to compare with your own model. The housing is symmetric about the plane \(y = 0\), so its center of mass lies in it:

[11]:
block = px.Pad(outline, 30)
pieces = sorted((block - housing).solids, key=lambda s: -s.mass)
print(len(pieces), "pieces taken out: the cavity", round(pieces[0].mass, 1), "mm³ and", len(pieces) - 1, "holes")
c = housing.center
print("volume", round(housing.mass, 1), "mm³")
print("mass", round(housing.mass * 2.68e-6, 4), "kg")
print("center of mass", (round(c.x, 4), round(c.z, 4)), "| off the plane y = 0 by", round(abs(c.y), 6))
15 pieces taken out: the cavity 56173.7 mm³ and 14 holes
volume 281671.8 mm³
mass 0.7549 kg
center of mass (-0.0, 14.0654) | off the plane y = 0 by 0.0

The housing as STEP, for another CAD system:

[12]:
housing.WriteStep("pump_housing.step")

The housing as STEP: pump_housing.step