From 542e3c531a81c111580e706bfba0490660b56231 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 9 Sep 2026 22:17:09 -0400 Subject: [PATCH] Add headphone holder model --- README.md | 5 +++ headphone_holder.py | 71 +++++++++++++++++++++++++++++++++++++++ img/headphone_holder.png | Bin 0 -> 15377 bytes 3 files changed, 76 insertions(+) create mode 100644 headphone_holder.py create mode 100644 img/headphone_holder.png diff --git a/README.md b/README.md index 9e06d51..df40706 100644 --- a/README.md +++ b/README.md @@ -18,3 +18,8 @@ uv run I needed a laptop holder that could hold 4 laptops (work, personal macbook, personal linux laptop, wife's laptop when she didn't need it). This is my first real model created with build123d. +### Headphone Holder + +![Headphone holder](./img/headphone_holder.png) + +This is a headphone holder with holes to screw into the rectangular leg of [my standing desk](https://www.amazon.com/dp/B0DX6XN1SJ?th=1). diff --git a/headphone_holder.py b/headphone_holder.py new file mode 100644 index 0000000..b9379fe --- /dev/null +++ b/headphone_holder.py @@ -0,0 +1,71 @@ +# /// script +# requires-python = ">=3.14" +# dependencies = ["ocp_vscode", "build123d"] +# /// + +from build123d import * +from ocp_vscode import * + +height = 1.0 * IN +hole_spacing = 1.5 * IN +x_padding = 0.25 * IN +y_padding = 0.25 * IN +thickness = 0.1 * IN +headphone_holder_thickness = 1.75 * IN +holder_roc = 3.75 * IN +bolt_diameter = 3 / 16 * IN +lip_length = 0.15 * IN +lip_thickness = 0.15 * IN + + +with BuildPart() as holder: + with BuildSketch() as sketch: + with BuildLine(): + l1 = Line((0, 0), (0, height)) + l2 = Line(l1 @ 1, (hole_spacing + 2 * x_padding, height)) + l3 = Line(l2 @ 1, (hole_spacing + 2 * x_padding, 0)) + l4 = RadiusArc(l1 @ 0, l3 @ 1, holder_roc) + make_face() + + with Locations( + (x_padding, height - y_padding), + (x_padding + hole_spacing, height - y_padding), + ): + Circle( + radius=bolt_diameter / 2, + mode=Mode.SUBTRACT, + align=(Align.CENTER, Align.MAX), + ) + extrude(amount=thickness) + fillet( + holder.edges().filter_by(Axis.Z).sort_by(Axis.Y)[-2:], radius=bolt_diameter / 2 + ) + with BuildSketch() as sketch: + with BuildLine(): + l1 = RadiusArc((0, 0), (hole_spacing + 2 * x_padding, 0), holder_roc) + offset(amount=lip_thickness, side=Side.LEFT) + make_face() + extrude(amount=headphone_holder_thickness + thickness) + + with BuildSketch( + Plane.XY.offset(headphone_holder_thickness + thickness) + ) as sketch2: + with BuildLine(): + l1 = RadiusArc((0, 0), (hole_spacing + 2 * x_padding, 0), holder_roc) + offset(amount=lip_thickness, side=Side.LEFT) + make_face() + with BuildSketch( + Plane.XY.offset(headphone_holder_thickness + thickness + lip_length) + ): + with BuildLine(): + l1 = RadiusArc( + (0, lip_length), + (hole_spacing + 2 * x_padding, lip_length), + holder_roc, + ) + offset(amount=lip_thickness, side=Side.LEFT) + make_face() + + loft() + show(holder) +export_stl(holder.part, "headphone_holder.stl") diff --git a/img/headphone_holder.png b/img/headphone_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..722e32b938afe43a25e40e7525f605f3123e214d GIT binary patch literal 15377 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 literal 0 HcmV?d00001