From 0899abeb90f72817bfe2e8ce28d280d3b27d6efc Mon Sep 17 00:00:00 2001 From: Marius Kintel Date: Sun, 5 Jan 2014 12:44:53 -0500 Subject: [PATCH] Added testcase for #591 --- testdata/scad/bugs/issue591.scad | 25 ++++++++++++++++++ tests/CMakeLists.txt | 1 + .../cgalpngtest/issue591-expected.png | Bin 0 -> 8778 bytes .../opencsgtest/issue591-expected.png | Bin 0 -> 8778 bytes 4 files changed, 26 insertions(+) create mode 100644 testdata/scad/bugs/issue591.scad create mode 100644 tests/regression/cgalpngtest/issue591-expected.png create mode 100644 tests/regression/opencsgtest/issue591-expected.png diff --git a/testdata/scad/bugs/issue591.scad b/testdata/scad/bugs/issue591.scad new file mode 100644 index 00000000..f30142fd --- /dev/null +++ b/testdata/scad/bugs/issue591.scad @@ -0,0 +1,25 @@ +// Creates the same "non-manifold" object (sharing one edge) using two techniques: +// o linear_extrude of two 2D objects +// o union of two linear_extrudes +// +// Subsequently cuts away the non-manifold part: +// -> the first technique fails, the second one succeeds +// +module cutoff() { + difference() { + children(); + translate([0,0,2.5]) cube(2, center=true); + } +} + +cutoff() { + linear_extrude(height=3, scale=[0,1], convexity=2) { + translate([1,0,0]) square(1,true); + translate([-1,0,0]) square(1,true); + } +} + +translate([0,2,0]) cutoff() { + linear_extrude(height=3, scale=[0,1]) translate([1,0,0]) square(1,true); + linear_extrude(height=3, scale=[0,1]) translate([-1,0,0]) square(1,true); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ed5bdc3f..a1c5cc6c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -891,6 +891,7 @@ list(APPEND BUGS_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue495.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue578b.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue582.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue584.scad + ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue591.scad ${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/issue585.scad) list(APPEND OPENCSGTEST_FILES ${BUGS_FILES}) diff --git a/tests/regression/cgalpngtest/issue591-expected.png b/tests/regression/cgalpngtest/issue591-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..07e1559f478d446b72d144453abc299f9fac3fbe GIT binary patch literal 8778 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 S6Z}R5vfgjMulO%=(*FWta#8dE literal 0 HcmV?d00001 diff --git a/tests/regression/opencsgtest/issue591-expected.png b/tests/regression/opencsgtest/issue591-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..07e1559f478d446b72d144453abc299f9fac3fbe GIT binary patch literal 8778 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 S6Z}R5vfgjMulO%=(*FWta#8dE literal 0 HcmV?d00001