54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
from build123d import Align, Box, BuildPart, Cylinder, Location, Locations, Mode
|
|
|
|
from benchmark_common import circular_edges, safe_chamfer
|
|
|
|
|
|
TOTAL_LENGTH = 120.0
|
|
LEFT_LENGTH = 30.0
|
|
MIDDLE_LENGTH = 60.0
|
|
RIGHT_LENGTH = 30.0
|
|
SMALL_DIAMETER = 20.0
|
|
MIDDLE_DIAMETER = 30.0
|
|
END_CHAMFER = 1.0
|
|
|
|
KEYWAY_X_START = 40.0
|
|
KEYWAY_X_END = 80.0
|
|
KEYWAY_WIDTH = 6.0
|
|
KEYWAY_DEPTH = 3.0
|
|
|
|
|
|
def _add_shaft_section(x_start: float, x_end: float, diameter: float):
|
|
with Locations(Location(((x_start + x_end) / 2.0, 0.0, 0.0))):
|
|
Cylinder(
|
|
radius=diameter / 2.0,
|
|
height=x_end - x_start,
|
|
rotation=(0.0, 90.0, 0.0),
|
|
align=(Align.CENTER, Align.CENTER, Align.CENTER),
|
|
mode=Mode.ADD,
|
|
)
|
|
|
|
|
|
def gen_step():
|
|
"""Return the stepped shaft with keyway benchmark model in millimeters."""
|
|
with BuildPart() as shaft:
|
|
_add_shaft_section(0.0, LEFT_LENGTH, SMALL_DIAMETER)
|
|
_add_shaft_section(LEFT_LENGTH, LEFT_LENGTH + MIDDLE_LENGTH, MIDDLE_DIAMETER)
|
|
_add_shaft_section(LEFT_LENGTH + MIDDLE_LENGTH, TOTAL_LENGTH, SMALL_DIAMETER)
|
|
|
|
with Locations(Location(((KEYWAY_X_START + KEYWAY_X_END) / 2.0, 0.0, MIDDLE_DIAMETER / 2.0 - KEYWAY_DEPTH))):
|
|
Box(
|
|
KEYWAY_X_END - KEYWAY_X_START,
|
|
KEYWAY_WIDTH,
|
|
KEYWAY_DEPTH + 2.0,
|
|
align=(Align.CENTER, Align.CENTER, Align.MIN),
|
|
mode=Mode.SUBTRACT,
|
|
)
|
|
|
|
part = shaft.part
|
|
end_edges = []
|
|
end_edges.extend(circular_edges(part, radius=SMALL_DIAMETER / 2.0, axis="x", coordinate=0.0))
|
|
end_edges.extend(circular_edges(part, radius=SMALL_DIAMETER / 2.0, axis="x", coordinate=TOTAL_LENGTH))
|
|
part = safe_chamfer(part, end_edges, length=END_CHAMFER)
|
|
part.label = "benchmark_04_stepped_shaft_keyway"
|
|
return part
|