M
mikeonenine@web.de
Tue, Feb 3, 2026 6:11 PM
Parts that need to be adjustable by turning need one or more curved slots for a fixing screw.
for(i=[1 : 1 : 5])
rotate([0, 0, i*360/5])
polygon([
for(i=[-10 : 1 : 10])
[12*sin(i), 12*cos(i)],
for(i=[-90-10 : 1 : 90-10])
[11*sin(10)+1*cos(i), 11*cos(10)+1*sin(i)],
for(i=[10 : -1 : -10])
[10*sin(i), 10*cos(i)],
for(i=[90+10 : -1 : -90+10])
[-11*sin(10)-1*cos(i), 11*cos(10)-1*sin(i)],
]);
Amazing, what you can do with polymers!
Parts that need to be adjustable by turning need one or more curved slots for a fixing screw.
`for(i=[1 : 1 : 5])`
`rotate([0, 0, i*360/5])`
`polygon([`
`for(i=[-10 : 1 : 10])`
`[12*sin(i), 12*cos(i)],`
`for(i=[-90-10 : 1 : 90-10])`
`[11*sin(10)+1*cos(i), 11*cos(10)+1*sin(i)],`
`for(i=[10 : -1 : -10])`
`[10*sin(i), 10*cos(i)],`
`for(i=[90+10 : -1 : -90+10])`
`[-11*sin(10)-1*cos(i), 11*cos(10)-1*sin(i)],`
`]);`
Amazing, what you can do with polymers!
RW
Raymond West
Tue, Feb 3, 2026 8:12 PM
Now make it parametric ;-}
On 03/02/2026 18:11, Caddiy via Discuss wrote:
Parts that need to be adjustable by turning need one or more curved
slots for a fixing screw.
|for(i=[1 : 1 : 5])|
|rotate([0, 0, i*360/5])|
|polygon([|
|for(i=[-10 : 1 : 10])|
|[12sin(i), 12cos(i)],|
|for(i=[-90-10 : 1 : 90-10])|
|[11sin(10)+1cos(i), 11cos(10)+1sin(i)],|
|for(i=[10 : -1 : -10])|
|[10sin(i), 10cos(i)],|
|for(i=[90+10 : -1 : -90+10])|
|[-11sin(10)-1cos(i), 11cos(10)-1sin(i)],|
|]);|
Amazing, what you can do with polymers!
OpenSCAD mailing list
To unsubscribe send an email todiscuss-leave@lists.openscad.org
Now make it parametric ;-}
On 03/02/2026 18:11, Caddiy via Discuss wrote:
>
> Parts that need to be adjustable by turning need one or more curved
> slots for a fixing screw.
>
> |for(i=[1 : 1 : 5])|
>
> |rotate([0, 0, i*360/5])|
>
> |polygon([|
>
> |for(i=[-10 : 1 : 10])|
>
> |[12*sin(i), 12*cos(i)],|
>
> |for(i=[-90-10 : 1 : 90-10])|
>
> |[11*sin(10)+1*cos(i), 11*cos(10)+1*sin(i)],|
>
> |for(i=[10 : -1 : -10])|
>
> |[10*sin(i), 10*cos(i)],|
>
> |for(i=[90+10 : -1 : -90+10])|
>
> |[-11*sin(10)-1*cos(i), 11*cos(10)-1*sin(i)],|
>
> |]);|
>
> Amazing, what you can do with polymers!
>
>
> _______________________________________________
> OpenSCAD mailing list
> To unsubscribe send an email todiscuss-leave@lists.openscad.org
M
mikeonenine@web.de
Tue, Feb 3, 2026 10:13 PM
I have a parametric version in my personal library, but I don’t want to spoil your fun!
I have a parametric version in my personal library, but I don’t want to spoil your fun!
M
mikeonenine@web.de
Tue, Feb 3, 2026 11:25 PM
Of course, in the (unlikely) event that anyone should have an urgent need for the parametric version, I would be happy to oblige.
But most people on this forum are way ahead of me in terms of maths, programming and stuff, and would presumably have no trouble working it out for themselves - if they really wanted to.
Of course, in the (unlikely) event that anyone should have an urgent need for the parametric version, I would be happy to oblige.
But most people on this forum are way ahead of me in terms of maths, programming and stuff, and would presumably have no trouble working it out for themselves - if they really wanted to.
DM
Douglas Miller
Thu, Feb 5, 2026 4:22 AM
This seems to be a considerably simpler method of generating curved slots:
$fn = 150;
theta = 30;
slotWidth = 3;
radius = 20;
projection()
rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true);
for(n=[0,theta]) rotate(n) translate([radius,0]) circle(d=slotWidth);
On 2/3/2026 1:11 PM, mikeonenine@web.de wrote:
Parts that need to be adjustable by turning need one or more curved
slots for a fixing screw.
|for(i=[1 : 1 : 5])|
|rotate([0, 0, i*360/5])|
|polygon([|
|for(i=[-10 : 1 : 10])|
|[12sin(i), 12cos(i)],|
|for(i=[-90-10 : 1 : 90-10])|
|[11sin(10)+1cos(i), 11cos(10)+1sin(i)],|
|for(i=[10 : -1 : -10])|
|[10sin(i), 10cos(i)],|
|for(i=[90+10 : -1 : -90+10])|
|[-11sin(10)-1cos(i), 11cos(10)-1sin(i)],|
|]);|
Amazing, what you can do with polymers!
This seems to be a considerably simpler method of generating curved slots:
$fn = 150;
theta = 30;
slotWidth = 3;
radius = 20;
projection()
rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true);
for(n=[0,theta]) rotate(n) translate([radius,0]) circle(d=slotWidth);
On 2/3/2026 1:11 PM, mikeonenine@web.de wrote:
>
> Parts that need to be adjustable by turning need one or more curved
> slots for a fixing screw.
>
> |for(i=[1 : 1 : 5])|
>
> |rotate([0, 0, i*360/5])|
>
> |polygon([|
>
> |for(i=[-10 : 1 : 10])|
>
> |[12*sin(i), 12*cos(i)],|
>
> |for(i=[-90-10 : 1 : 90-10])|
>
> |[11*sin(10)+1*cos(i), 11*cos(10)+1*sin(i)],|
>
> |for(i=[10 : -1 : -10])|
>
> |[10*sin(i), 10*cos(i)],|
>
> |for(i=[90+10 : -1 : -90+10])|
>
> |[-11*sin(10)-1*cos(i), 11*cos(10)-1*sin(i)],|
>
> |]);|
>
> Amazing, what you can do with polymers!
>
M
mikeonenine@web.de
Thu, Feb 5, 2026 5:08 AM
This seems to be a considerably simpler method of generating curved slots:
$fn = 150;
theta = 30;
slotWidth = 3;
radius = 20;
projection()
rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true);
for(n=[0,theta]) rotate(n) translate([radius,0]) circle(d=slotWidth);
Yes, that’s the easy way.
But what does projection() do?
theta = 30;
slotWidth = 3;
radius = 20;
rotate([0, 0, -theta/2])
rotate_extrude(angle=theta, $fn = 150)
translate([radius,0])
square([slotWidth, 1], true);
for(n=[-theta/2, theta/2])
rotate(n)
translate([radius, 0])
circle(d=slotWidth);
Douglas Miller wrote:
> This seems to be a considerably simpler method of generating curved slots:
>
> $fn = 150;
> theta = 30;
> slotWidth = 3;
> radius = 20;
>
> projection()
> rotate_extrude(angle=theta) translate(\[radius,0\])
> square(\[slotWidth,1\],true);
> for(n=\[0,theta\]) rotate(n) translate(\[radius,0\]) circle(d=slotWidth);
Yes, that’s the easy way.
But what does projection() do?
`theta = 30;`
`slotWidth = 3;`
`radius = 20;`
`rotate([0, 0, -theta/2])`
`rotate_extrude(angle=theta, $fn = 150) `
`translate([radius,0])`
`square([slotWidth, 1], true);`
`for(n=[-theta/2, theta/2]) `
`rotate(n) `
`translate([radius, 0]) `
`circle(d=slotWidth);`
MM
Michael Möller
Thu, Feb 5, 2026 10:17 AM
Projection is the opposite of extrude, ie turn a 3D shape into a 2D.
The 2D square is rotate_ extruded to a 3D shape, flattened to a 2D shape to
be joined with the circles.
Elegant/Simpler is a matter of opinion ;-)
M²
tors. 5. feb. 2026, 06.09 skrev Caddiy via Discuss <
discuss@lists.openscad.org>:
Douglas Miller wrote:
This seems to be a considerably simpler method of generating curved slots:
$fn = 150; theta = 30; slotWidth = 3; radius = 20;
projection() rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true); for(n=[0,theta]) rotate(n)
translate([radius,0]) circle(d=slotWidth);
Yes, that’s the easy way.
But what does projection() do?
theta = 30;
slotWidth = 3;
radius = 20;
rotate([0, 0, -theta/2])
rotate_extrude(angle=theta, $fn = 150)
translate([radius,0])
square([slotWidth, 1], true);
for(n=[-theta/2, theta/2])
rotate(n)
translate([radius, 0])
circle(d=slotWidth);
OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org
Projection is the opposite of extrude, ie turn a 3D shape into a 2D.
The 2D square is rotate_ extruded to a 3D shape, flattened to a 2D shape to
be joined with the circles.
Elegant/Simpler is a matter of opinion ;-)
M²
tors. 5. feb. 2026, 06.09 skrev Caddiy via Discuss <
discuss@lists.openscad.org>:
> Douglas Miller wrote:
>
> This seems to be a considerably simpler method of generating curved slots:
>
> $fn = 150; theta = 30; slotWidth = 3; radius = 20;
>
> projection() rotate_extrude(angle=theta) translate([radius,0])
> square([slotWidth,1],true); for(n=[0,theta]) rotate(n)
> translate([radius,0]) circle(d=slotWidth);
>
> Yes, that’s the easy way.
>
> But what does projection() do?
>
> theta = 30;
>
> slotWidth = 3;
>
> radius = 20;
>
> rotate([0, 0, -theta/2])
>
> rotate_extrude(angle=theta, $fn = 150)
>
> translate([radius,0])
>
> square([slotWidth, 1], true);
>
> for(n=[-theta/2, theta/2])
>
> rotate(n)
>
> translate([radius, 0])
>
> circle(d=slotWidth);
>
>
> _______________________________________________
> OpenSCAD mailing list
> To unsubscribe send an email to discuss-leave@lists.openscad.org
DP
Dan Perry
Thu, Feb 5, 2026 10:52 AM
Here's another way, for BOSL2 users:
zrot_copies(n=5)
stroke(arc(angle=30, start=-15, r=gear_rad), width=3);
[image: image.png]
On Thu, Feb 5, 2026 at 4:22 AM Douglas Miller via Discuss <
discuss@lists.openscad.org> wrote:
This seems to be a considerably simpler method of generating curved slots:
$fn = 150;
theta = 30;
slotWidth = 3;
radius = 20;
projection()
rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true);
for(n=[0,theta]) rotate(n) translate([radius,0]) circle(d=slotWidth);
On 2/3/2026 1:11 PM, mikeonenine@web.de wrote:
Parts that need to be adjustable by turning need one or more curved slots
for a fixing screw.
for(i=[1 : 1 : 5])
rotate([0, 0, i*360/5])
polygon([
for(i=[-10 : 1 : 10])
[12sin(i), 12cos(i)],
for(i=[-90-10 : 1 : 90-10])
[11sin(10)+1cos(i), 11cos(10)+1sin(i)],
for(i=[10 : -1 : -10])
[10sin(i), 10cos(i)],
for(i=[90+10 : -1 : -90+10])
[-11sin(10)-1cos(i), 11cos(10)-1sin(i)],
]);
Amazing, what you can do with polymers!
OpenSCAD mailing list
To unsubscribe send an email to discuss-leave@lists.openscad.org
Here's another way, for BOSL2 users:
zrot_copies(n=5)
stroke(arc(angle=30, start=-15, r=gear_rad), width=3);
[image: image.png]
On Thu, Feb 5, 2026 at 4:22 AM Douglas Miller via Discuss <
discuss@lists.openscad.org> wrote:
> This seems to be a considerably simpler method of generating curved slots:
>
> $fn = 150;
> theta = 30;
> slotWidth = 3;
> radius = 20;
>
> projection()
> rotate_extrude(angle=theta) translate([radius,0])
> square([slotWidth,1],true);
> for(n=[0,theta]) rotate(n) translate([radius,0]) circle(d=slotWidth);
>
> On 2/3/2026 1:11 PM, mikeonenine@web.de wrote:
>
> Parts that need to be adjustable by turning need one or more curved slots
> for a fixing screw.
>
> for(i=[1 : 1 : 5])
>
> rotate([0, 0, i*360/5])
>
> polygon([
>
> for(i=[-10 : 1 : 10])
>
> [12*sin(i), 12*cos(i)],
>
> for(i=[-90-10 : 1 : 90-10])
>
> [11*sin(10)+1*cos(i), 11*cos(10)+1*sin(i)],
>
> for(i=[10 : -1 : -10])
>
> [10*sin(i), 10*cos(i)],
>
> for(i=[90+10 : -1 : -90+10])
>
> [-11*sin(10)-1*cos(i), 11*cos(10)-1*sin(i)],
>
> ]);
>
> Amazing, what you can do with polymers!
>
>
> _______________________________________________
> OpenSCAD mailing list
> To unsubscribe send an email to discuss-leave@lists.openscad.org
DM
Douglas Miller
Thu, Feb 5, 2026 1:29 PM
Without projection(), you have a mix of 2D and 3D objects (the circles,
and the arc, respectively): rotate_extrude() produces a 3D object;
projection() turns that into a 2D object.
On 2/5/2026 12:08 AM, mikeonenine@web.de wrote:
Douglas Miller wrote:
This seems to be a considerably simpler method of generating
curved slots:
$fn = 150; theta = 30; slotWidth = 3; radius = 20;
projection() rotate_extrude(angle=theta) translate([radius,0])
square([slotWidth,1],true); for(n=[0,theta]) rotate(n)
translate([radius,0]) circle(d=slotWidth);
Yes, that’s the easy way.
But what does projection() do?
|theta = 30;|
|slotWidth = 3;|
|radius = 20;|
|rotate([0, 0, -theta/2])|
|rotate_extrude(angle=theta, $fn = 150) |
|translate([radius,0])|
|square([slotWidth, 1], true);|
|for(n=[-theta/2, theta/2]) |
|rotate(n) |
|translate([radius, 0]) |
|circle(d=slotWidth);|
Without projection(), you have a mix of 2D and 3D objects (the circles,
and the arc, respectively): rotate_extrude() produces a 3D object;
projection() turns that into a 2D object.
On 2/5/2026 12:08 AM, mikeonenine@web.de wrote:
>
> Douglas Miller wrote:
>
> This seems to be a considerably simpler method of generating
> curved slots:
>
> $fn = 150; theta = 30; slotWidth = 3; radius = 20;
>
> projection() rotate_extrude(angle=theta) translate([radius,0])
> square([slotWidth,1],true); for(n=[0,theta]) rotate(n)
> translate([radius,0]) circle(d=slotWidth);
>
> Yes, that’s the easy way.
>
> But what does projection() do?
>
> |theta = 30;|
>
> |slotWidth = 3;|
>
> |radius = 20;|
>
> |rotate([0, 0, -theta/2])|
>
> |rotate_extrude(angle=theta, $fn = 150) |
>
> |translate([radius,0])|
>
> |square([slotWidth, 1], true);|
>
> |for(n=[-theta/2, theta/2]) |
>
> |rotate(n) |
>
> |translate([radius, 0]) |
>
> |circle(d=slotWidth);|
>
>
M
mikeonenine@web.de
Thu, Feb 5, 2026 3:19 PM
Looks interesting but all I get is a load of error warnings:
WARNING: Ignoring unknown variable 'gear_rad' in file , line 4
ERROR: Assertion '(is_def(r) && (r > 0))' failed: "Arc radius invalid" in file BOSL2/drawing.scad, line 790
TRACE: called by 'arc' in file Own, line 4
TRACE: called by 'stroke' in file Own, line 4
TRACE: called by 'children' in file BOSL2/distributors.scad, line 1180
TRACE: called by 'children' in file BOSL2/distributors.scad, line 902
TRACE: called by 'children' in file BOSL2/transforms.scad, line 1585
TRACE: called by 'children' in file builtins.scad, line 31
TRACE: called by 'translate' in file builtins.scad, line 31
TRACE: called by '_translate' in file BOSL2/transforms.scad, line 1585
TRACE: called by 'translate' in file BOSL2/distributors.scad, line 901
TRACE: called by 'children' in file BOSL2/transforms.scad, line 537
TRACE: called by 'children' in file BOSL2/transforms.scad, line 1617
TRACE: called by 'children' in file builtins.scad, line 30
Maybe I have an old version of BOSL2? Is there a new one somewhere?
Looks interesting but all I get is a load of error warnings:
[WARNING: Ignoring unknown variable 'gear_rad' in file , line 4](4,C:/Users/Admin/Documents/OpenSCAD/libraries/Own)
[ERROR: Assertion '(is_def(r) && (r > 0))' failed: "Arc radius invalid" in file BOSL2/drawing.scad, line 790](790,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/drawing.scad)
[TRACE: called by 'arc' in file Own, line 4](4,C:/Users/Admin/Documents/OpenSCAD/libraries/Own)
[TRACE: called by 'stroke' in file Own, line 4](4,C:/Users/Admin/Documents/OpenSCAD/libraries/Own)
[TRACE: called by 'children' in file BOSL2/distributors.scad, line 1180](1180,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/distributors.scad)
[TRACE: called by 'children' in file BOSL2/distributors.scad, line 902](902,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/distributors.scad)
[TRACE: called by 'children' in file BOSL2/transforms.scad, line 1585](1585,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/transforms.scad)
[TRACE: called by 'children' in file builtins.scad, line 31](31,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/builtins.scad)
[TRACE: called by 'translate' in file builtins.scad, line 31](31,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/builtins.scad)
[TRACE: called by '_translate' in file BOSL2/transforms.scad, line 1585](1585,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/transforms.scad)
[TRACE: called by 'translate' in file BOSL2/distributors.scad, line 901](901,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/distributors.scad)
[TRACE: called by 'children' in file BOSL2/transforms.scad, line 537](537,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/transforms.scad)
[TRACE: called by 'children' in file BOSL2/transforms.scad, line 1617](1617,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/transforms.scad)
[TRACE: called by 'children' in file builtins.scad, line 30](30,C:/Users/Admin/Documents/OpenSCAD/libraries/BOSL2/builtins.scad)
Maybe I have an old version of BOSL2? Is there a new one somewhere?