From 595153e53a8259188681bb93f9671ae9ce16b474 Mon Sep 17 00:00:00 2001 From: Martin Frost Date: Mon, 2 Nov 2026 23:14:14 +0100 Subject: [PATCH] Add ap_feet model This is a model to create some space underneath my AX820-WRT wifi access point. --- out/ap_feet.stl | Bin 0 -> 16084 bytes src/models/ap_feet.py | 67 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 out/ap_feet.stl create mode 100644 src/models/ap_feet.py diff --git a/out/ap_feet.stl b/out/ap_feet.stl new file mode 100644 index 0000000000000000000000000000000000000000..85ab715462a234471036327e0f97b03b6db12a36 GIT binary patch literal 16084 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 literal 0 HcmV?d00001 diff --git a/src/models/ap_feet.py b/src/models/ap_feet.py new file mode 100644 index 0000000..7396ff0 --- /dev/null +++ b/src/models/ap_feet.py @@ -0,0 +1,67 @@ +from pathlib import Path + +from build123d import ( + Align, + BuildPart, + BuildSketch, + GridLocations, + Kind, + Mode, + Rectangle, + export_stl, + extrude, + offset, +) + +block_width = 8 +block_height = 11 +block_depth = 13 + + +wall_thickness = 1.5 +beam_thickness = 2 + +frame_height = block_height + 107 +frame_width = block_width + 78.25 +frame_depth = 1.5 + +OUTPUT_DIR = Path("out") + + +def block(): + with BuildPart(): + with BuildSketch() as frame_plan: + perimeter = Rectangle(width=frame_width, height=frame_height) + offset( + perimeter, + -wall_thickness, + kind=Kind.INTERSECTION, + mode=Mode.SUBTRACT, + ) + + with BuildSketch() as blocks_plan: + with GridLocations( + frame_width, frame_height, 2, 2, align=(Align.CENTER, Align.CENTER) + ): + perimeter = Rectangle(width=block_width, height=block_height) + offset( + perimeter, + -wall_thickness, + kind=Kind.INTERSECTION, + mode=Mode.SUBTRACT, + ) + + blocks = extrude(blocks_plan, amount=block_depth) + frame = extrude(frame_plan, amount=frame_depth) + + return blocks + frame + + +def main(): + part = block() + + export_stl(part, OUTPUT_DIR / "ap_feet.stl") + + +if __name__ == "__main__": + main()