mirror of
https://github.com/revarbat/BOSL2.git
synced 2025-08-29 21:20:05 +02:00
Removed overrides for square() and circle() builtin modules.
This commit is contained in:
144
shapes2d.scad
144
shapes2d.scad
@@ -694,6 +694,148 @@ function _turtle_command(command, parm, parm2, state, index) =
|
||||
|
||||
|
||||
|
||||
// Section: 2D Primitives
|
||||
|
||||
// Function&Module: rect()
|
||||
// Usage:
|
||||
// rect(size, [center], [rounding], [chamfer], [anchor], [spin])
|
||||
// Description:
|
||||
// When called as a module, creates a 2D rectangle of the given size, with optional rounding or chamfering.
|
||||
// When called as a function, returns a 2D path/list of points for a square/rectangle of the given size.
|
||||
// Arguments:
|
||||
// size = The size of the rectangle to create. If given as a scalar, both X and Y will be the same size.
|
||||
// rounding = The rounding radius for the corners. If given as a list of four numbers, gives individual radii for each corner, in the order [X+Y+,X-Y+,X-Y-,X+Y-]. Default: 0 (no rounding)
|
||||
// chamfer = The chamfer size for the corners. If given as a list of four numbers, gives individual chamfers for each corner, in the order [X+Y+,X-Y+,X-Y-,X+Y-]. Default: 0 (no chamfer)
|
||||
// center = If given and true, overrides `anchor` to be `CENTER`. If given and false, overrides `anchor` to be `FRONT+LEFT`.
|
||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||
// Example(2D):
|
||||
// rect(40);
|
||||
// Example(2D): Centered
|
||||
// rect([40,30], center=true);
|
||||
// Example(2D): Anchored
|
||||
// rect([40,30], anchor=FRONT);
|
||||
// Example(2D): Spun
|
||||
// rect([40,30], anchor=FRONT, spin=30);
|
||||
// Example(2D): Chamferred Rect
|
||||
// rect([40,30], chamfer=5, center=true);
|
||||
// Example(2D): Rounded Rect
|
||||
// rect([40,30], rounding=5, center=true);
|
||||
// Example(2D): Mixed Chamferring and Rounding
|
||||
// rect([40,30],center=true,rounding=[5,0,10,0],chamfer=[0,8,0,15],$fa=1,$fs=1);
|
||||
// Example(2D): Called as Function
|
||||
// path = rect([40,30], chamfer=5, anchor=FRONT, spin=30);
|
||||
// stroke(path, closed=true);
|
||||
// move_copies(path) color("blue") circle(d=2,$fn=8);
|
||||
module rect(size=1, center, rounding=0, chamfer=0, anchor, spin=0) {
|
||||
size = is_num(size)? [size,size] : point2d(size);
|
||||
anchor = get_anchor(anchor, center, FRONT+LEFT, FRONT+LEFT);
|
||||
attachable(anchor,spin, two_d=true, size=size) {
|
||||
if (rounding==0 && chamfer==0) {
|
||||
square(size, center=true);
|
||||
} else {
|
||||
pts = rect(size=size, rounding=rounding, chamfer=chamfer, center=true);
|
||||
polygon(pts);
|
||||
}
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function rect(size=1, center, rounding=0, chamfer=0, anchor, spin=0) =
|
||||
assert(is_num(size) || is_vector(size))
|
||||
assert(is_num(chamfer) || len(chamfer)==4)
|
||||
assert(is_num(rounding) || len(rounding)==4)
|
||||
let(
|
||||
size = is_num(size)? [size,size] : point2d(size),
|
||||
anchor = get_anchor(anchor, center, FRONT+LEFT, FRONT+LEFT),
|
||||
complex = rounding!=0 || chamfer!=0
|
||||
)
|
||||
(rounding==0 && chamfer==0)? let(
|
||||
path = [
|
||||
[ size.x/2, -size.y/2],
|
||||
[-size.x/2, -size.y/2],
|
||||
[-size.x/2, size.y/2],
|
||||
[ size.x/2, size.y/2]
|
||||
]
|
||||
) rot(spin, p=move(-vmul(anchor,size/2), p=path)) :
|
||||
let(
|
||||
chamfer = is_list(chamfer)? chamfer : [for (i=[0:3]) chamfer],
|
||||
rounding = is_list(rounding)? rounding : [for (i=[0:3]) rounding],
|
||||
quadorder = [3,2,1,0],
|
||||
quadpos = [[1,1],[-1,1],[-1,-1],[1,-1]],
|
||||
insets = [for (i=[0:3]) chamfer[i]>0? chamfer[i] : rounding[i]>0? rounding[i] : 0],
|
||||
insets_x = max(insets[0]+insets[1],insets[2]+insets[3]),
|
||||
insets_y = max(insets[0]+insets[3],insets[1]+insets[2])
|
||||
)
|
||||
assert(insets_x <= size.x, "Requested roundings and/or chamfers exceed the rect width.")
|
||||
assert(insets_y <= size.y, "Requested roundings and/or chamfers exceed the rect height.")
|
||||
let(
|
||||
path = [
|
||||
for(i = [0:3])
|
||||
let(
|
||||
quad = quadorder[i],
|
||||
inset = insets[quad],
|
||||
cverts = quant(segs(inset),4)/4,
|
||||
cp = vmul(size/2-[inset,inset], quadpos[quad]),
|
||||
step = 90/cverts,
|
||||
angs =
|
||||
chamfer[quad] > 0? [0,-90]-90*[i,i] :
|
||||
rounding[quad] > 0? [for (j=[0:1:cverts]) 360-j*step-i*90] :
|
||||
[0]
|
||||
)
|
||||
each [for (a = angs) cp + inset*[cos(a),sin(a)]]
|
||||
]
|
||||
) complex?
|
||||
reorient(anchor,spin, two_d=true, path=path, p=path) :
|
||||
reorient(anchor,spin, two_d=true, size=size, p=path);
|
||||
|
||||
|
||||
// Function&Module: oval()
|
||||
// Usage:
|
||||
// oval(r|d, [realign], [circum])
|
||||
// Description:
|
||||
// When called as a module, creates a 2D polygon that approximates a circle of the given size.
|
||||
// When called as a function, returns a 2D list of points (path) for a polygon that approximates a circle of the given size.
|
||||
// Arguments:
|
||||
// r = The radius of the circle to create.
|
||||
// d = The diameter of the circle to create.
|
||||
// realign = If true, rotates the polygon that approximates the circle by half of one size.
|
||||
// circum = If true, the polygon that approximates the circle will be upsized slightly to circumscribe the theoretical circle. If false, it inscribes the theoretical circle. Default: false
|
||||
// anchor = Translate so anchor point is at origin (0,0,0). See [anchor](attachments.scad#anchor). Default: `CENTER`
|
||||
// spin = Rotate this many degrees around the Z axis after anchor. See [spin](attachments.scad#spin). Default: `0`
|
||||
// Example(2D): By Radius
|
||||
// oval(r=25);
|
||||
// Example(2D): By Diameter
|
||||
// oval(d=50);
|
||||
// Example(2D): Anchoring
|
||||
// oval(d=50, anchor=FRONT);
|
||||
// Example(2D): Spin
|
||||
// oval(d=50, anchor=FRONT, spin=45);
|
||||
// Example(NORENDER): Called as Function
|
||||
// path = oval(d=50, anchor=FRONT, spin=45);
|
||||
module oval(r, d, realign=false, circum=false, anchor=CENTER, spin=0) {
|
||||
r = get_radius(r=r, d=d, dflt=1);
|
||||
sides = segs(r);
|
||||
rr = circum? r/cos(180/sides) : r;
|
||||
attachable(anchor,spin, two_d=true, r=rr) {
|
||||
zrot(realign? 180/sides : 0) circle(r=r, $fn=sides);
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function oval(r, d, realign=false, circum=false, anchor=CENTER, spin=0) =
|
||||
let(
|
||||
r = get_radius(r=r, d=d, dflt=1),
|
||||
sides = segs(r),
|
||||
offset = realign? 180/sides : 0,
|
||||
rr = r / (circum? cos(180/sides) : 1),
|
||||
pts = [for (i=[0:1:sides-1]) let(a=360-offset-i*360/sides) rr*[cos(a),sin(a)]]
|
||||
) reorient(anchor,spin, two_d=true, r=rr, p=pts);
|
||||
|
||||
|
||||
|
||||
// Section: 2D N-Gons
|
||||
|
||||
// Function&Module: regular_ngon()
|
||||
@@ -738,7 +880,7 @@ function regular_ngon(n=6, r, d, or, od, ir, id, side, rounding=0, realign=false
|
||||
)
|
||||
assert(!is_undef(r), "regular_ngon(): need to specify one of r, d, or, od, ir, id, side.")
|
||||
let(
|
||||
path = rounding==0? circle(r=r, realign=realign, $fn=n) : (
|
||||
path = rounding==0? oval(r=r, realign=realign, $fn=n) : (
|
||||
let(
|
||||
steps = floor(segs(r)/n),
|
||||
step = 360/n/steps,
|
||||
|
Reference in New Issue
Block a user