206 lines
7.2 KiB
Plaintext
206 lines
7.2 KiB
Plaintext
![]() |
// Piston
|
||
|
// A piston is the component of an engine that transfers linear motion into circular motion. The piston head is accelerated by exploding fuel, which drives a connecting rod to rotate a crankshaft.
|
||
|
|
||
|
// Set units
|
||
|
@settings(defaultLengthUnit = mm)
|
||
|
|
||
|
// Define parameters
|
||
|
stroke = 110
|
||
|
bore = 92
|
||
|
pistonHeight = 75
|
||
|
crankPos = 40deg
|
||
|
crankRadius = 36
|
||
|
pinHeight = 35
|
||
|
rodLength = 201.2
|
||
|
|
||
|
// A simple sketch to define piston position at different crank parameters
|
||
|
kinematicSketch = startSketchOn(XZ)
|
||
|
startProfile(kinematicSketch, at = [0, 0])
|
||
|
|> angledLine(angle = crankPos, length = stroke / 2, tag = $seg01)
|
||
|
|> line(
|
||
|
endAbsolute = [
|
||
|
0,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2))
|
||
|
],
|
||
|
tag = $seg02,
|
||
|
)
|
||
|
|> angledLine(angle = segAng(seg02) - 90, length = 1, tag = $seg03)
|
||
|
|
||
|
// Sketch a profile with a total width equal to half the bore of the piston head. Include lands and gaps for compression rings. Then revolve the profile about the center axis to form the start of a piston head
|
||
|
pistonBore = startSketchOn(XZ)
|
||
|
|> startProfile(at = [
|
||
|
0.1,
|
||
|
pinHeight + stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2))
|
||
|
])
|
||
|
|> xLine(length = bore / 2)
|
||
|
|> yLine(length = -3)
|
||
|
|> xLine(length = -3)
|
||
|
|> yLine(length = -2)
|
||
|
|> xLine(length = 3)
|
||
|
|> yLine(length = -3)
|
||
|
|> xLine(length = -3)
|
||
|
|> yLine(length = -2)
|
||
|
|> xLine(length = 3)
|
||
|
|> yLine(length = -3)
|
||
|
|> xLine(length = -3)
|
||
|
|> yLine(length = -2)
|
||
|
|> xLine(length = 3)
|
||
|
|> yLine(endAbsolute = profileStartY(%) - pistonHeight - 3)
|
||
|
|> xLine(length = -8)
|
||
|
|> yLine(endAbsolute = profileStartY(%) - 8 - (bore / 4))
|
||
|
|> tangentialArc(angle = 90, radius = bore / 4)
|
||
|
|> xLine(endAbsolute = profileStartX(%))
|
||
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
||
|
|> close()
|
||
|
|> revolve(angle = 360, axis = Y)
|
||
|
|
||
|
// Create a square profile divot to subtract from the piston head
|
||
|
divots = startSketchOn(YZ)
|
||
|
|> startProfile(at = [
|
||
|
bore / 2 - 6,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2)) + pistonHeight / 4 / 2
|
||
|
])
|
||
|
|> yLine(length = -pistonHeight / 4)
|
||
|
|> xLine(length = 25.75)
|
||
|
|> yLine(endAbsolute = profileStartY(%))
|
||
|
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|
||
|
|> close()
|
||
|
|> extrude(length = 314, symmetric = true)
|
||
|
|
||
|
// Rotate another divot to the opposite side
|
||
|
cutDivots = patternCircular3d(
|
||
|
divots,
|
||
|
instances = 2,
|
||
|
axis = [0, 0, 1],
|
||
|
center = [0, 0, 0],
|
||
|
arcDegrees = 360,
|
||
|
rotateDuplicates = true,
|
||
|
)
|
||
|
|
||
|
// Cut the divots from the piston head
|
||
|
// WORKED PREVIOUSLY
|
||
|
pistonDiv = subtract([pistonBore], tools = union(cutDivots))
|
||
|
|
||
|
// Extrude and fillet a wrist pin
|
||
|
wristPin = startSketchOn(XZ)
|
||
|
|> circle(
|
||
|
center = [
|
||
|
0,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2))
|
||
|
],
|
||
|
radius = pistonHeight / 10,
|
||
|
tag = $seg04,
|
||
|
)
|
||
|
|> extrude(length = bore, symmetric = true)
|
||
|
|> fillet(radius = pistonHeight / 40, tags = [getOppositeEdge(seg04), seg04])
|
||
|
|
||
|
// Cut a rounded profile to arc the bottom of the piston skirt
|
||
|
pistonSkirt = startSketchOn(XZ)
|
||
|
|> startProfile(at = [
|
||
|
0,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2)) + pinHeight - (pistonHeight * 0.95)
|
||
|
])
|
||
|
|> xLine(length = .1)
|
||
|
|> tangentialArc(endAbsolute = [
|
||
|
bore / 2 + 4,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2)) + pinHeight - pistonHeight - 3
|
||
|
])
|
||
|
|> yLine(endAbsolute = 0)
|
||
|
|> xLine(endAbsolute = 0)
|
||
|
|> mirror2d(axis = Y)
|
||
|
|> close()
|
||
|
|> extrude(length = 314, symmetric = true)
|
||
|
// WORKED PREVIOUSLY
|
||
|
pistonHead = subtract([pistonDiv], tools = [pistonSkirt])
|
||
|
|
||
|
// Create a connecting rod that spans from the crank position to the piston height
|
||
|
connectingRodProfile = startSketchOn(XZ)
|
||
|
|> startProfile(at = [
|
||
|
segEndX(seg01) - (1.25 * crankRadius * cos(segAng(seg02))),
|
||
|
segEndY(seg01) - (1.25 * crankRadius * sin(segAng(seg02)))
|
||
|
])
|
||
|
|> angledLine(angle = segAng(seg02) - 90, length = crankRadius / 2)
|
||
|
|> tangentialArc(angle = 45, radius = 5)
|
||
|
|> angledLine(angle = segAng(seg02) - 45, length = crankRadius / 2)
|
||
|
|> tangentialArc(angle = -45, radius = 5)
|
||
|
|> angledLine(angle = segAng(seg02) - 90, length = crankRadius / 2)
|
||
|
|> angledLine(angle = segAng(seg02), length = crankRadius * 1.625)
|
||
|
|> angledLine(angle = segAng(seg02) + 90, length = crankRadius / 2)
|
||
|
|> tangentialArc(angle = -45, radius = 5)
|
||
|
|> angledLine(angle = segAng(seg02) + 45, length = crankRadius / 2)
|
||
|
|> tangentialArc(angle = -45, radius = crankRadius)
|
||
|
|> angledLineThatIntersects(angle = segAng(seg02), intersectTag = seg03, offset = -crankRadius / 2)
|
||
|
|> tangentialArc(angle = -45, radius = 5)
|
||
|
|> angledLine(angle = segAng(seg02) - 45, length = crankRadius / 5)
|
||
|
|> tangentialArc(angle = -45, radius = 5)
|
||
|
|> angledLine(angle = segAng(seg02) - 90, length = crankRadius / 5)
|
||
|
|> angledLineThatIntersects(angle = segAng(seg02), intersectTag = seg03, offset = crankRadius / 3)
|
||
|
|> angledLineThatIntersects(angle = segAng(seg02) + 45, intersectTag = seg03, offset = crankRadius / 2)
|
||
|
|> angledLineThatIntersects(%, angle = segAng(seg02) + 90, intersectTag = seg02)
|
||
|
|> mirror2d(axis = seg02)
|
||
|
|> close()
|
||
|
|> extrude(length = 54, symmetric = true)
|
||
|
|
||
|
// Define a plane perpendicular to the connecting rod
|
||
|
connectingRodPlane = {
|
||
|
origin = [
|
||
|
0,
|
||
|
0.0,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2))
|
||
|
],
|
||
|
xAxis = [
|
||
|
-1 * sin(segAng(seg02)),
|
||
|
0,
|
||
|
1 * cos(segAng(seg02))
|
||
|
],
|
||
|
yAxis = [0.0, 1.0, 0.0]
|
||
|
}
|
||
|
|
||
|
// Extrude an oval profile through the connecting rod to define its boundaries in the other dimensions
|
||
|
connectingRodShape = startSketchOn(connectingRodPlane)
|
||
|
|> startProfile(at = [crankRadius * 1.5, 0])
|
||
|
|> yLine(length = 4)
|
||
|
|> tangentialArc(angle = 80, radius = 8)
|
||
|
|> tangentialArc(endAbsolute = [-lastSegX(%), lastSegY(%)])
|
||
|
|> tangentialArc(angle = 80, radius = 8)
|
||
|
|> yLine(endAbsolute = profileStartY(%))
|
||
|
|> mirror2d(axis = X)
|
||
|
|> close()
|
||
|
|> extrude(length = 554, symmetric = true)
|
||
|
|
||
|
connectingRodShapeSubtract = intersect([
|
||
|
connectingRodProfile,
|
||
|
connectingRodShape
|
||
|
])
|
||
|
|
||
|
// Bore holes in the connecting rod for the wrist pin and crank
|
||
|
// REPLACED POLYGON CUTS WITH CIRCLES
|
||
|
boreHoles = startSketchOn(XZ)
|
||
|
crankBore = circle(boreHoles, center = polar(angle = crankPos, length = stroke / 2), radius = crankRadius)
|
||
|
|> extrude(length = 54, symmetric = true)
|
||
|
wristPinHole = circle(
|
||
|
boreHoles,
|
||
|
center = [
|
||
|
0,
|
||
|
stroke / 2 * sin(crankPos) + sqrt(rodLength ^ 2 - ((stroke / 2 * cos(crankPos)) ^ 2))
|
||
|
],
|
||
|
radius = pistonHeight / 10,
|
||
|
)
|
||
|
|> extrude(length = 54, symmetric = true)
|
||
|
|
||
|
// Subtract out the bore holes
|
||
|
connectingRodBore = subtract([connectingRodShapeSubtract], tools = union([wristPinHole, crankBore]))
|
||
|
|
||
|
// Bore holes for the connecting rod bolts
|
||
|
boltHoles = startSketchOn(connectingRodPlane)
|
||
|
|> circle(center = [45, 0], radius = 5)
|
||
|
|> patternCircular2d(
|
||
|
instances = 2,
|
||
|
center = [0, 0],
|
||
|
arcDegrees = 360,
|
||
|
rotateDuplicates = true,
|
||
|
)
|
||
|
|> extrude(length = 300)
|
||
|
|
||
|
connectingRod = subtract([connectingRodBore], tools = union(boltHoles))
|