Irev-Dev / Round-Anything

A set of OpenSCAD utilities for adding radii and fillets, that embodies a robust approach to developing OpenSCAD parts.
https://kurthutten.com/blog/round-anything-a-pragmatic-approach-to-openscad-design
MIT License
492 stars 48 forks source link

Helpers for converting [x, y] tuples to [x, y, r] tuples and back #27

Open echo-bravo-yahoo opened 3 years ago

echo-bravo-yahoo commented 3 years ago

One of the consistent API pain points I have is moving between an [x, y] and [x, y, r] coordinate lists. I frequently find I want to start with a polygon in [x, y] space while developing iteratively, and only later move it to an [x, y, r] polygon. Additionally, I've wanted to use translateRadiiPoints for regular [x, y] polygons before. Here are two (dumb, simple) helper functions that I frequently use; I think Round-Anything could benefit from similar (better-named) functions.

function rless(list) = [for (i=[0:len(list)-1]) [list[i][0], list[i][1]]] ;
function rish(list, r) = [for (i=[0:len(list)-1]) [list[i][0], list[i][1], r]] ;

Example where rless is helpful:

portWidth = 5;
portHeight = 12.50;
points = [
    [0,         0,           2],
    [0,         portHeight,  2],
    [portWidth, portHeight,  2],
    [portWidth, 0,           2],
];

polygon(rless(points));

And for rish:

portWidth = 5;
portHeight = 12.50;
points = [
    [0,         0],
    [0,         portHeight],
    [portWidth, portHeight],
    [portWidth, 0],
];

polygon(rless(translateRadiiPoints(rish(points, 0)));
echo-bravo-yahoo commented 3 years ago

I understand if you think this doesn't meet the bar for inclusion, but I find openSCAD's functions to be incredibly painful to write. My usual approach when writing in unfamiliar languages is to be verbose and split things into more operations with well-named variables as intermediate steps, and openSCAD's function syntax seems actively hostile to that.

Irev-Dev commented 3 years ago

It's a good point @Trial-In-Error. I already have a rless equivalent function getpoints(p)=[for(i=[0:len(p)-1])[p[i].x,p[i].y]];// gets [x,y]list of[x,y,r]list but not rish. Plus getpoints is not documented. I'll leave this open and try and do something about it soon, but prod me if it's been a couple weeks and I haven't got around to it.