# pyright: reportUnusedCallResult=false, reportWildcardImportFromLibrary=false from math import radians, sin from build123d import * def build_drive_shaft_mount(): bearing_offset = 20 bearing_diameter = 22 bearing_through_hole_diameter = 15 bearing_height = 7 shaft_clearance_diameter = 25 core_width = 40 thickness = 20 screw_blocks_width = thickness screw_blocks_height = bearing_offset screw_blocks_radius = 3 screw_head_diameter = 8.5 screw_head_depth = 5 screw_body_diameter = 5 track_width = 6.2 track_height = 1.7 assert (bearing_offset - bearing_diameter / 2) > 0 assert (core_width - bearing_diameter) > 0 assert (screw_blocks_width - (screw_blocks_radius * 2)) >= 0 assert (bearing_offset - screw_blocks_height) >= 0 with BuildPart() as drive_shaft_mount: with BuildSketch(): with BuildLine() as profile: l1 = Line( (0,0), ((core_width / 2) + screw_blocks_width, 0) ) polyline_path = ( l1 @ 1, ((l1 @ 1).X, screw_blocks_height), (core_width / 2, screw_blocks_height), ) match (float)(bearing_offset - screw_blocks_height): case 0: FilletPolyline( *polyline_path, radius=screw_blocks_radius ) case len if len > 0 and len < screw_blocks_radius: sbl = FilletPolyline( *polyline_path, radius=screw_blocks_radius ) Line( sbl @ 1, ((sbl @ 1).X, bearing_offset) ) case len if len >= screw_blocks_radius: FilletPolyline( *polyline_path, (core_width / 2, bearing_offset), radius=screw_blocks_radius ) case _: assert False CenterArc((0, bearing_offset), core_width / 2, 90, -90) mirror(profile.line, Plane.YZ) make_face() with Locations((0, bearing_offset)): Circle(bearing_through_hole_diameter / 2, mode=Mode.SUBTRACT) extrude(amount=thickness / 2) mirror(about=Plane.XY) with Locations((0, bearing_offset, drive_shaft_mount.faces().sort_by(Axis.Z)[-1].center().Z)): Hole(shaft_clearance_diameter / 2, (thickness / 2) - (bearing_height / 2)) Hole(bearing_diameter / 2, (thickness / 2) + (bearing_height / 2)) # this is a seem channel with BuildSketch(Location((0, bearing_offset + bearing_diameter / 2, drive_shaft_mount.faces().sort_by(Axis.Z)[-1].center().Z))): Triangle(A=90, b=1, c=1) extrude(amount=-((thickness / 2) + (bearing_height / 2)), mode=Mode.SUBTRACT) with BuildPart() as track: angle = 30 Box(core_width + (screw_blocks_width * 2), track_width + ((sin(radians(angle))/sin(radians(90-angle))) * track_height * 2), track_height, (90, 0, 0), (Align.CENTER, Align.CENTER, Align.MIN)) chamfer(track.edges().filter_by(Axis.X).sort_by(Axis.Y)[:2], track_height - 0.01, angle=angle) with Locations(drive_shaft_mount.faces().filter_by(Plane.XZ).sort_by(Axis.Y)[-2:]): CounterBoreHole(screw_body_diameter / 2, screw_head_diameter / 2, screw_head_depth) return drive_shaft_mount def build_drive_shaft_bar_adapter(): ext_size = 20.3 ext_track_width = 6.2 ext_track_height = 1.8 height = 60 thickness = 10 ext_screw_hole_diam = 6 ext_screw_hole_offset = 10 shaft_hub_bore_diam = 8 shaft_hub_center_diam = 14 shaft_hub_center_depth = 3 # if you where to draw a square around the center of the shaft hub this var is the length of the sides and each corner is the center of a screw hole shaft_hub_screw_spacing = 16 shaft_hub_screw_diam = 4 # the depth of the screw holes into the shaft hub shaft_hub_screw_depth = 8 shaft_hub_screw_head_depth = 4 shaft_hub_screw_head_diam = 7 with BuildPart() as drive_shaft_bar_adapter: Cylinder((ext_size / 2) + thickness, height, align=(Align.CENTER, Align.CENTER, Align.MIN)) # hollow the box with BuildSketch(Plane((0, 0, thickness))): Rectangle(ext_size, ext_size) with PolarLocations(ext_size / 2, 4): Rectangle(ext_track_height, ext_track_width, align=(Align.MAX, Align.CENTER), mode=Mode.SUBTRACT) extrude(amount=height - thickness, mode=Mode.SUBTRACT) # extrusion screw holes screws_origin = Location((0, 0, height - ext_screw_hole_offset)) with Locations(screws_origin): with BuildPart(screws_origin, mode=Mode.SUBTRACT) as ext_track_cut_out: Box(ext_size, ext_size, ext_screw_hole_diam + 8) chamfer(ext_track_cut_out.edges(), 3) with PolarLocations(0, 4): with Locations(Rotation(0, 90, 0)): Hole(ext_screw_hole_diam / 2) # shaft interface with Locations(drive_shaft_bar_adapter.faces().filter_by(Plane.XY).sort_by(Axis.Z)[1].offset(shaft_hub_screw_head_depth)): l = shaft_hub_screw_spacing / 2 with Locations((-l, -l), (-l, l), (l, -l), (l, l)): CounterBoreHole(shaft_hub_screw_diam / 2, shaft_hub_screw_head_diam / 2, shaft_hub_screw_head_depth, thickness + shaft_hub_screw_depth) with Locations(drive_shaft_bar_adapter.faces().sort_by(Axis.Z)[0].center()): Hole((shaft_hub_bore_diam + 0.5) / 2) Hole(shaft_hub_center_diam / 2, shaft_hub_center_depth) return drive_shaft_bar_adapter drive_shaft_mount = build_drive_shaft_mount() assert drive_shaft_mount.part is not None export_step(drive_shaft_mount.part, "drive shaft mount.step") drive_shaft_bar_adapter = build_drive_shaft_bar_adapter() assert drive_shaft_bar_adapter.part is not None export_step(drive_shaft_bar_adapter.part, "drive shaft bar adapter.step")