Merge branch 'master' of github.com:openscad/openscad

felipesanches-svg
Marius Kintel 2013-02-02 13:28:06 -05:00
commit eb30d42b5d
2 changed files with 87 additions and 1 deletions

View File

@ -20,7 +20,7 @@ shared_ptr<CSGTerm> CSGTermNormalizer::normalize(const shared_ptr<CSGTerm> &root
PRINTB("WARNING: Normalized tree is growing past %d elements. Aborting normalization.\n", this->limit);
// Clean up any partially evaluated terms
shared_ptr<CSGTerm> newroot = root, tmproot;
while (newroot != tmproot) {
while (newroot && newroot != tmproot) {
tmproot = newroot;
newroot = collapse_null_terms(tmproot);
}

View File

@ -0,0 +1,86 @@
/*
* 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: