mirror of https://github.com/vitalif/openscad
87 lines
2.2 KiB
OpenSCAD
87 lines
2.2 KiB
OpenSCAD
/*
|
|
* Reported by Justin Charette
|
|
* Causes a crash in CSGTermNormalizer::normalize() when CSG element count
|
|
* exceeds limit setting in preferences (verified with default value of 2000).
|
|
*/
|
|
|
|
|
|
$fn=20;
|
|
|
|
/* donut (r1, r2, t) {{{
|
|
r1 = radius of torus
|
|
r2 = radius of torus cross section (circle)
|
|
t = thickness of shell (t == 0 is
|
|
*/
|
|
module donut (r1, r2, t=0) {
|
|
difference() {
|
|
rotate_extrude( convexity=6 ) {
|
|
translate([r1, 0, 0]) {
|
|
circle( r = r2 );
|
|
}
|
|
}
|
|
// (t == 0 ? solid : hollow )
|
|
if (t > 0) {
|
|
rotate_extrude( convexity=6 ) {
|
|
translate([r1, 0, 0]) {
|
|
circle( r = r2-t );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} //}}}
|
|
|
|
/* half donut (r1, r2, t, round) {{{
|
|
r1 = radius of torus
|
|
r2 = radius of torus cross section (circle)
|
|
t = thickness of shell
|
|
round = trim ends of semi-torus so they are round
|
|
*/
|
|
module half_donut (r1, r2, t=1, round=false) {
|
|
difference() {
|
|
donut( r1, r2, t );
|
|
difference() {
|
|
translate( [0, -((r1+r2)/2+0.5), 0] )
|
|
scale( [2*(r1+r2)+1, r1+r2+1, 2*r2+1] )
|
|
square( 1, center=true );
|
|
if (round) {
|
|
rotate( 90, [0, 1, 0] )
|
|
cylinder( 2*(r1+r2)+2, r2, r2, center=true );
|
|
}
|
|
}
|
|
}
|
|
} //}}}
|
|
|
|
/* donut flange (r1, r2, a1, a2, a_step, t, round) {{{
|
|
r1 = radius of torus
|
|
r2 = radius of torus cross section (circle)
|
|
a1 = starting angle of flange rotation
|
|
a2 = stopping angle of flange rotation
|
|
a_step = increment size of flange rotation
|
|
t = thickness of shell (t == 0 is solid, t in (0, r2) is hollow)
|
|
round = (true/false) to trim ends of semi-torus so they are round
|
|
*/
|
|
module donut_flange (r1, r2, a1, a2, a_step=1, t=0, round=false) {
|
|
difference() {
|
|
union() {
|
|
for (a = [a1:a_step:a2]) {
|
|
rotate( a, [1, 0, 0] )
|
|
half_donut( r1, r2, round );
|
|
}
|
|
}
|
|
// (t == 0 ? solid : hollow )
|
|
if (t > 0) {
|
|
union() {
|
|
for (a = [a1:a_step:a2]) {
|
|
rotate( a, [1, 0, 0] )
|
|
half_donut( r1, r2-t, round );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} //}}}
|
|
|
|
donut( 20, 5 );
|
|
donut_flange( 20, 5, 0, 50, 10, t=1, round=false );
|
|
|
|
// vim: set et sw=2 ts=2 sts=2 ai sta sr fdm=marker:
|