Created
October 9, 2025 21:47
-
-
Save ednisley/e3dd9a7d90a30ce8ce938de2b5c0edad to your computer and use it in GitHub Desktop.
OpenSCAD source code: Clothes dryer vent snout for filter bag
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Clothes dryer vent filter snout | |
| // Ed Nisley - KE4ZNU | |
| // 2025-10-07 | |
| include <BOSL2/std.scad> | |
| Layout = "Ring"; // [Show,Build,Ring,Taper] | |
| /* [Hidden] */ | |
| ID = 0; | |
| OD = 1; | |
| LENGTH = 2; | |
| HoleWindage = 0.2; | |
| Protrusion = 0.1; | |
| NumSides = 4*3*2*4; | |
| $fn=NumSides; | |
| Gap = 5.0; | |
| // Centers of corner rounding circles | |
| InnerWidth = 3.0; // wall inside snout | |
| InnerRadius = 6.0; // inner corner rounding | |
| RR = [130.0/2 - InnerRadius,91.0/2 - InnerRadius]; // right rear corner | |
| RF = [112.0/2 - InnerRadius,-(91.0/2 - InnerRadius)]; // right front corner | |
| CornerCtrs = [[RR.x,RR.y],[RF.x,RF.y],[-RF.x,RF.y],[-RR.x,RR.y]]; // clockwise from RR | |
| InsertHeight = 7.0; // overall height inside the snout | |
| TabOC = [73.0,91.0]; // tabs locking into snout | |
| TabCtrs = [[TabOC.x/2,TabOC.y/2],[TabOC.x/2,-TabOC.y/2],[-TabOC.x/2,-TabOC.y/2],[-TabOC.x/2,TabOC.y/2]]; | |
| TabRadius = 5.0; | |
| TabHeight = 3.0; | |
| TaperHeight = 20.0; // Taper holding filter bag | |
| TaperRadius = 10.0; // outward to capture bag string | |
| TaperWidth = 2.0; // wall width | |
| TaperCtrs = CornerCtrs + [[0,-(TaperRadius - InnerWidth)],[0,0],[0,0],[0,-(TaperRadius - InnerWidth)]]; | |
| //----- | |
| // Clear inside vent opening as 2D shape | |
| module Opening() { | |
| hull() | |
| for (p = CornerCtrs) | |
| translate(p) | |
| circle(r=InnerRadius); | |
| } | |
| //----- | |
| // Insert ring locking into vent snout | |
| module Ring() { | |
| difference() { | |
| union() { | |
| linear_extrude(h=InsertHeight) | |
| offset(delta=InnerWidth) | |
| hull() | |
| for (p = CornerCtrs) | |
| translate(p) | |
| circle(r=InnerRadius); | |
| up(InsertHeight - TabHeight) | |
| linear_extrude(h=TabHeight) | |
| for (p = TabCtrs) | |
| translate(p) | |
| circle(r=TabRadius); | |
| } | |
| down(Protrusion) | |
| linear_extrude(h=2*InsertHeight) | |
| Opening(); | |
| } | |
| } | |
| //----- | |
| // Taper glued to ring | |
| module Taper() { | |
| difference() { | |
| hull() { | |
| up(TaperHeight) | |
| linear_extrude(h=Protrusion) | |
| offset(delta=InnerWidth) | |
| hull() | |
| for (p = CornerCtrs) | |
| translate(p) | |
| circle(r=InnerRadius); | |
| linear_extrude(h=Protrusion) | |
| offset(delta=TaperRadius) | |
| hull() | |
| for (p = TaperCtrs) | |
| translate(p) | |
| circle(r=TaperRadius); | |
| } | |
| hull() { | |
| up(TaperHeight) | |
| linear_extrude(h=2*Protrusion) | |
| offset(delta=InnerWidth) | |
| hull() | |
| for (p = CornerCtrs) | |
| translate(p) | |
| circle(r=InnerRadius - InnerWidth); | |
| down(Protrusion) | |
| linear_extrude(h=2*Protrusion) | |
| offset(delta=TaperRadius - TaperWidth) | |
| hull() | |
| for (p = TaperCtrs) | |
| translate(p) | |
| circle(r=TaperRadius); | |
| } | |
| } | |
| } | |
| //----- | |
| // Build things | |
| if (Layout == "Ring") | |
| Ring(); | |
| if (Layout == "Taper") | |
| Taper(); | |
| if (Layout == "Show") { | |
| up(TaperHeight) | |
| Ring(); | |
| Taper(); | |
| } | |
| if (Layout == "Build") { | |
| back(55) | |
| up(InsertHeight) | |
| yrot(180) | |
| Ring(); | |
| fwd(55) | |
| up(TaperHeight) | |
| yrot(180) | |
| Taper(); | |
| } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
More details on my blog at https://softsolder.com/2025/10/10/dryer-vent-filter-snout/