From 9758112e05d02c9cf156828ecd47b7770b602628 Mon Sep 17 00:00:00 2001 From: Chris Palmer Date: Tue, 15 Apr 2025 11:59:20 +0100 Subject: [PATCH] Added chamfer_hole() utility module. --- readme.md | 65 ++++++++++++++++++++++++++++-------------- tests/png/chamfer.png | Bin 0 -> 47391 bytes utils/chamfer.scad | 38 ++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 tests/png/chamfer.png create mode 100644 utils/chamfer.scad diff --git a/readme.md b/readme.md index 01dd621..93891e3 100644 --- a/readme.md +++ b/readme.md @@ -24,28 +24,28 @@ A list of changes classified as breaking, additions or fixes is maintained in [C 7_segments IECs Radials Box Annotation BOM Antennas Inserts Rails Butt_box Bezier Clip Axials Jack Ring_terminals Cable_clip Catenary Global - BLDC_motors LDRs Rockers Cable_grommets Core_xy Polyholes - Ball_bearings LED_meters Rod Camera_housing Dimension Rounded_rectangle - Batteries LEDs Rod_ends Carriers Dogbones Sphere - Bearing_blocks Leadnuts SBR_rails Corner_block Fillet Teardrops - Belts Light_strips SK_brackets Door_hinge Gears - Blowers Linear_bearings SMDs Door_latch Hanging_hole - Box_sections Magnets SSRs Drag_chain Horiholes - Bulldogs Mains_sockets Screws Fan_guard Layout - Buttons Microswitches Sealing_strip Fixing_block Maths - Cable_strips Microview Servo_motors Flat_hinge Offset - Cameras Modules Shaft_couplings Foot PCB_utils - Circlips Nuts Sheets Handle Quadrant - Components O_ring Spades Knob Round - DIP Opengrab Spools LED_bezel Rounded_cylinder - D_connectors PCB Springs PCB_mount Rounded_polygon - Displays PCBs Stepper_motors PSU_shroud Rounded_triangle - Extrusion_brackets PSUs Swiss_clips Pocket_handle Sector - Extrusions Panel_meters Terminals Press_fit Splines - Fans Photo_interrupters Toggles Printed_box Sweep - Fastons Pillars Transformers Printed_pulleys Thread - Fuseholder Pillow_blocks Ttracks Ribbon_clamp Tube - Gear_motors Pin_headers Tubings SSR_shroud + BLDC_motors LDRs Rockers Cable_grommets Chamfer Polyholes + Ball_bearings LED_meters Rod Camera_housing Core_xy Rounded_rectangle + Batteries LEDs Rod_ends Carriers Dimension Sphere + Bearing_blocks Leadnuts SBR_rails Corner_block Dogbones Teardrops + Belts Light_strips SK_brackets Door_hinge Fillet + Blowers Linear_bearings SMDs Door_latch Gears + Box_sections Magnets SSRs Drag_chain Hanging_hole + Bulldogs Mains_sockets Screws Fan_guard Horiholes + Buttons Microswitches Sealing_strip Fixing_block Layout + Cable_strips Microview Servo_motors Flat_hinge Maths + Cameras Modules Shaft_couplings Foot Offset + Circlips Nuts Sheets Handle PCB_utils + Components O_ring Spades Knob Quadrant + DIP Opengrab Spools LED_bezel Round + D_connectors PCB Springs PCB_mount Rounded_cylinder + Displays PCBs Stepper_motors PSU_shroud Rounded_polygon + Extrusion_brackets PSUs Swiss_clips Pocket_handle Rounded_triangle + Extrusions Panel_meters Terminals Press_fit Sector + Fans Photo_interrupters Toggles Printed_box Splines + Fastons Pillars Transformers Printed_pulleys Sweep + Fuseholder Pillow_blocks Ttracks Ribbon_clamp Thread + Gear_motors Pin_headers Tubings SSR_shroud Tube Geared_steppers Potentiometers Variacs Screw_knob Green_terminals Pulleys Veroboard Socket_box HT_pipes Washers Strap_handle @@ -7182,6 +7182,27 @@ The coordinates of the lowest point on the curve can be retrieved by calling `ca ![catenary](tests/png/catenary.png) +Top + +--- + +## Chamfer +45 degree chamfer the entrance to holes. + +If the hole shape is concave then it must be described as a list of 2D convex children. + +[utils/chamfer.scad](utils/chamfer.scad) Implementation. + +[tests/chamfer.scad](tests/chamfer.scad) Code for this example. + +### Modules +| Module | Description | +|:--- |:--- | +| `chamfer_hole(depth = 1)` | Chamfer a hole given a 2D outline as a child | + +![chamfer](tests/png/chamfer.png) + + Top --- diff --git a/tests/png/chamfer.png b/tests/png/chamfer.png new file mode 100644 index 0000000000000000000000000000000000000000..5b538be57260373917daf00684d97dda6511353a GIT binary patch literal 47391 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. +// + +// +//! 45 degree chamfer the entrance to holes. +//! +//! If the hole shape is concave then it must be described as a list of 2D convex children. +// +include + +module chamfer_hole(depth = 1) { //! Chamfer a hole given a 2D outline as a child + for(i = [0 : $children - 1]) + hull() { + linear_extrude(eps) + offset(depth) + children(i); + + translate_z(-depth) + linear_extrude(eps) + children(i); + } +}