Connecting rod
A connecting rod joins a piston to its crankshaft. The big eye runs on the crank pin, the small eye on the piston pin, and the shank between them carries the gas force and the inertia of the piston. Its shank is an I-section, a web between two flanges, which is stiff in bending for its weight. As a solid, the rod’s plan is two eyes and a tapered shank united and filleted, padded to the rod’s width, and the I-section is a pocket in each face whose outline is the plan offset inward by the flanges’ width. Model the rod from the drawing in planex2d or in any CAD system, then check its volume, mass and center of mass against the values at the end of the page. A solution in planex2d follows.

[1]:
import math
import netgen.occ as occ
import planex as px
The plan
The plan lies on the xy plane, which becomes the middle plane of the rod’s width. The big eye is a disc of 50 around the origin and the small eye a disc of 24 around (100, 0). The shank is a trapezoid along the \(x\) axis, 20 wide at 40 from the big eye’s center and 16 wide at 80. Its straight flanks run on to the eyes’ centers, where it is 24 and 14 wide. px.Unify unites them into one face with four corners where the shank meets the eyes (Figure 1):
[3]:
big = px.Circle((0, 0), 50 / 2).Face()
small = px.Circle((100, 0), 24 / 2).Face()
shank = px.FromPolyline([(0, -12), (100, -7), (100, 7), (0, 12)], closed=True).Face() # its corners as points
plan = px.Unify([big, small, shank]).Face() # the one face of the union
print("corners", [(round(v.x, 3), round(v.y, 3)) for v in plan.vertices])
corners [(22.511, 10.874), (22.511, -10.874), (90.608, -7.47), (90.608, 7.47)]
(a) Two eyes and the shank
(b) United
Fillet rounds the corners at the big eye with a radius of 8 and those at the small eye with 5. vertices(near=) picks the corner nearest to a point, so the points are given roughly (Figure 2):
[5]:
plan = plan.Fillet([plan.vertices(near=(22, 11)), plan.vertices(near=(22, -11))], 8)
plan = plan.Fillet([plan.vertices(near=(91, 7.5)), plan.vertices(near=(91, -7.5))], 5)
print("plan", round(plan.mass, 4), "mm²")
plan 3608.6161 mm²
The rod
px.Pad extrudes the plan 8 to both sides of the xy plane, 16 in all. The bores, 32 in the big eye and 14 in the small eye, are one face, united, and pocketed 8 to both sides, through the rod (Figure 3):
[7]:
rod = px.Pad(plan, 8, length2=8)
bores = px.Unify([px.Circle((0, 0), 32 / 2).Face(), px.Circle((100, 0), 14 / 2).Face()])
rod = px.Pocket(rod, bores, 8, length2=8)
The I-section
The flanges are 3 wide along the shank’s edges and the web 6 thick. The pocket’s outline is the plan offset inward by the flanges’ width, less a disc of radius 28 around the big eye’s center and one of 15 around the small eye’s, so that 3 of material stay around each eye, and its corners are rounded with a radius of 2.5 (Figure 4):
[9]:
region = plan.Offset(-3, inplace=False) - px.Circle((0, 0), 28).Face() - px.Circle((100, 0), 15).Face()
region = region.Face() # the one face left: the shank's middle
region = region.Fillet(list(region.vertices), 2.5)
print("pocket", round(region.mass, 4), "mm²")
pocket 702.8008 mm²
The pocket is 5 deep in each face, so that the web keeps \(16 - 2 \cdot 5\). The region, moved to the top face at \(z = 8\), is pocketed down. Moved to the bottom face, it is pocketed up with reverse=True, the same pocket mirrored about the middle plane (Figure 5):
[11]:
rod = px.Pocket(rod, region.Translated((0, 0, 8)), 5)
rod = px.Pocket(rod, region.Translated((0, 0, -8)), 5, reverse=True)
The checks
These are the volume, the mass in steel 42CrMo4 (7.85 g/cm³) and the center of mass, with the origin at the big eye’s center in the middle plane, to compare with your own model. The volume follows from the areas, \(16\,(A_\text{plan} - A_\text{bores}) - 2 \cdot 5\,A_\text{pocket}\). The rod is symmetric about the middle plane and about the plane \(y = 0\), so its center of mass lies on the \(x\) axis:
[13]:
exact = (plan.mass - bores.mass) * 16 - 2 * region.mass * 5
c = rod.center
print("volume", round(rod.mass, 2), "mm³, exact", round(exact, 2))
print("mass", round(rod.mass * 7.85e-6, 4), "kg")
print("center of mass", round(c.x, 3), "from the big eye's center, off the x axis by", round(math.hypot(c.y, c.z), 6))
volume 35378.88 mm³, exact 35378.88
mass 0.2777 kg
center of mass 32.132 from the big eye's center, off the x axis by 0.0
The rod as STEP, for another CAD system:
[14]:
rod.WriteStep("connecting_rod.step")
The rod as STEP: connecting_rod.step