From bf0d9edf38132049a2d8a8f5de4d6e70657a8870 Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Wed, 15 Jan 2014 22:23:50 -0500 Subject: [PATCH] Change behavior of intersection: intersecting something with an empty object will be empty --- src/CGALEvaluator.cc | 5 +++++ .../scad/features/intersection-tests.scad | 19 ++++++++++++++++++ .../intersection-tests-expected.png | Bin 7455 -> 7853 bytes .../dumptest/intersection-tests-expected.csg | 19 ++++++++++++++++++ .../intersection-tests-expected.png | Bin 7273 -> 7519 bytes .../intersection-tests-expected.png | Bin 11327 -> 12180 bytes 6 files changed, 43 insertions(+) diff --git a/src/CGALEvaluator.cc b/src/CGALEvaluator.cc index 37d4fd8c..60d98b8e 100644 --- a/src/CGALEvaluator.cc +++ b/src/CGALEvaluator.cc @@ -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 => empty if (target.dim != src.dim) return; // If someone tries to e.g. union 2d and 3d objects diff --git a/testdata/scad/features/intersection-tests.scad b/testdata/scad/features/intersection-tests.scad index 4a1d7e3f..d4e32dbd 100644 --- a/testdata/scad/features/intersection-tests.scad +++ b/testdata/scad/features/intersection-tests.scad @@ -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); +} diff --git a/tests/regression/cgalpngtest/intersection-tests-expected.png b/tests/regression/cgalpngtest/intersection-tests-expected.png index d287e5ff2ba5eca42c28b5df14fb22e612b90be1..0d40a99b29fa8e7cc6d7639a5330398f11f0d5b7 100644 GIT binary patch literal 7853 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 literal 7455 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 D#G=$@ diff --git a/tests/regression/dumptest/intersection-tests-expected.csg b/tests/regression/dumptest/intersection-tests-expected.csg index bfb50771..1091c8d8 100644 --- a/tests/regression/dumptest/intersection-tests-expected.csg +++ b/tests/regression/dumptest/intersection-tests-expected.csg @@ -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); + } + } } diff --git a/tests/regression/opencsgtest/intersection-tests-expected.png b/tests/regression/opencsgtest/intersection-tests-expected.png index 772e2dc6ba3dd014484842c1745c1ddf224467da..3cc588f42c6b2614193fdff765bbb57d4bc3c44a 100644 GIT binary patch literal 7519 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 X{J+Ws(cK3C_~*ROb?>V^{)zt!UGVFk literal 7273 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 diff --git a/tests/regression/throwntogethertest/intersection-tests-expected.png b/tests/regression/throwntogethertest/intersection-tests-expected.png index f6cc56fbe7cf86967dae6d6acb886c0642f3ee5d..6dee3c62591617b6c215f723690cd6e695ee74a1 100644 GIT binary patch literal 12180 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