Change behavior of intersection: intersecting something with an empty object will be empty

export-menu
Marius Kintel 2014-01-15 22:23:50 -05:00
parent 1fc52f8cd4
commit bf0d9edf38
6 changed files with 43 additions and 0 deletions

View File

@ -61,6 +61,11 @@ void CGALEvaluator::process(CGAL_Nef_polyhedron &target, const CGAL_Nef_polyhedr
if (target.dim != 2 && target.dim != 3) {
assert(false && "Dimension of Nef polyhedron must be 2 or 3");
}
// Intersecting something with nothing results in nothing
if (src.isEmpty() && op == CGE_INTERSECTION) {
target = src;
return;
}
if (src.isEmpty()) return; // Empty polyhedron. This can happen for e.g. square([0,0])
if (target.isEmpty() && op != CGE_UNION) return; // empty op <something> => empty
if (target.dim != src.dim) return; // If someone tries to e.g. union 2d and 3d objects

View File

@ -39,3 +39,22 @@ translate([-12,12,0]) intersection() {
cube([10,10,10], center=true);
translate([0,-9.99,-9.99]) cube([10,10,10], center=true);
}
// Intersecting something with nothing
translate([0,-12,0]) intersection() {
cylinder(r=4, h=5, center=true);
cube(0);
}
// Intersecting 2D with 3D
translate([12,-12,0]) intersection() {
cube([5,5,5], center=true);
circle(r=2);
}
// Non-geometry (echo) statement as first child should be ignored
translate([24,-12,0]) intersection() {
echo("difference-tests");
cube([5,5,5], center=true);
cylinder(r=2, h=20, center=true);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -54,4 +54,23 @@ group() {
}
}
}
multmatrix([[1, 0, 0, 0], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
intersection() {
cylinder($fn = 0, $fa = 12, $fs = 2, h = 5, r1 = 4, r2 = 4, center = true);
cube(size = [0, 0, 0], center = false);
}
}
multmatrix([[1, 0, 0, 12], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
intersection() {
cube(size = [5, 5, 5], center = true);
circle($fn = 0, $fa = 12, $fs = 2, r = 2);
}
}
multmatrix([[1, 0, 0, 24], [0, 1, 0, -12], [0, 0, 1, 0], [0, 0, 0, 1]]) {
intersection() {
group();
cube(size = [5, 5, 5], center = true);
cylinder($fn = 0, $fa = 12, $fs = 2, h = 20, r1 = 2, r2 = 2, center = true);
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB