diff --git a/src/offset.cc b/src/offset.cc index dda4115a..0ad06d08 100644 --- a/src/offset.cc +++ b/src/offset.cc @@ -81,10 +81,14 @@ AbstractNode *OffsetModule::instantiate(const Context *ctx, const ModuleInstanti } else if (std::string("miter") == jt) { node->join_type = ClipperLib::jtMiter; } else { - PRINTB("Unknown join_type for offset(): '%1'", jt); + PRINTB("WARNING: Unknown join_type for offset(): '%s'", jt); + } + + if ((node->join_type != ClipperLib::jtMiter) && !miter_limit.isUndefined()) { + PRINTB("WARNING: miter_limit is ignored in offset() for join_type: '%s'", jt); } } - + std::vector instantiatednodes = inst->instantiateChildren(evalctx); node->children.insert(node->children.end(), instantiatednodes.begin(), instantiatednodes.end()); diff --git a/testdata/scad/features/offset-tests.scad b/testdata/scad/features/offset-tests.scad new file mode 100644 index 00000000..af6655fc --- /dev/null +++ b/testdata/scad/features/offset-tests.scad @@ -0,0 +1,39 @@ + +module shape1(x, y) { + translate([50 * x, 50 * y]) difference() { + square([30, 30], center = true); + square([8, 8], center = true); + } +} + +module shape2(x, y) { + translate([50 * x, 50 * y]) { + polygon(points=[ + [-15, 80],[15, 80],[0,-15],[-8, 60],[8, 60],[0, 5] + ], paths=[ + [0,1,2],[3,4,5] + ]); + } +} + +offset(delta = -1, join_type = "miter") shape2(-1, 2); +shape2(0, 2); +offset(delta = 1, join_type = "miter") shape2(1, 2); + +offset(delta = -1, join_type = "miter", miter_limit = 10) shape2(2, 2); +offset(delta = 1, join_type = "miter", miter_limit = 10) shape2(3, 2); + +offset(delta = -1, join_type = "square", miter_limit = 10) shape2(2, -1); +offset(delta = 1, join_type = "square", miter_limit = 10) shape2(3, -1); + +offset(delta = -5, join_type = "round") shape1(-1, 1); +shape1(0, 1); +offset(delta = 5, join_type = "round") shape1(1, 1); + +offset(-4) shape1(-1, 0); +shape1(0, 0); +offset(4) shape1(1, 0); + +offset(delta = -5) shape1(-1, -1); +shape1(0, -1); +offset(delta = 5) shape1(1, -1); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4596f00f..931b8e6f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -547,6 +547,7 @@ set(CORE_SOURCES ../src/rendersettings.cc ../src/dxfdata.cc ../src/dxfdim.cc + ../src/offset.cc ../src/linearextrude.cc ../src/rotateextrude.cc ../src/printutils.cc diff --git a/tests/regression/cgalpngtest/offset-tests-expected.png b/tests/regression/cgalpngtest/offset-tests-expected.png new file mode 100644 index 00000000..f8db6b77 Binary files /dev/null and b/tests/regression/cgalpngtest/offset-tests-expected.png differ diff --git a/tests/regression/dumptest/offset-tests-expected.csg b/tests/regression/dumptest/offset-tests-expected.csg new file mode 100644 index 00000000..2c8cf7d0 --- /dev/null +++ b/tests/regression/dumptest/offset-tests-expected.csg @@ -0,0 +1,133 @@ +group() { + offset(delta = -1, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, -50], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + group() { + multmatrix([[1, 0, 0, 0], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + offset(delta = 1, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 50], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + offset(delta = -1, join_type = miter, miter_limit = 10, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 100], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + offset(delta = 1, join_type = miter, miter_limit = 10, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 150], [0, 1, 0, 100], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + offset(delta = -1, join_type = bevel, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 100], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + offset(delta = 1, join_type = bevel, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 150], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + polygon(points = [[-15, 80], [15, 80], [0, -15], [-8, 60], [8, 60], [0, 5]], paths = [[0, 1, 2], [3, 4, 5]], convexity = 1); + } + } + } + offset(delta = -5, join_type = round, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, -50], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } + group() { + multmatrix([[1, 0, 0, 0], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + offset(delta = 5, join_type = round, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 50], [0, 1, 0, 50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } + offset(delta = -4, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, -50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } + group() { + multmatrix([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + offset(delta = 4, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 50], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } + offset(delta = -5, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, -50], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } + group() { + multmatrix([[1, 0, 0, 0], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + offset(delta = 5, join_type = miter, miter_limit = 2, $fn = 0, $fa = 12, $fs = 2) { + group() { + multmatrix([[1, 0, 0, 50], [0, 1, 0, -50], [0, 0, 1, 0], [0, 0, 0, 1]]) { + difference() { + square(size = [30, 30], center = true); + square(size = [8, 8], center = true); + } + } + } + } +} diff --git a/tests/regression/opencsgtest/offset-tests-expected.png b/tests/regression/opencsgtest/offset-tests-expected.png new file mode 100644 index 00000000..f3bfe9cc Binary files /dev/null and b/tests/regression/opencsgtest/offset-tests-expected.png differ diff --git a/tests/regression/throwntogethertest/offset-tests-expected.png b/tests/regression/throwntogethertest/offset-tests-expected.png new file mode 100644 index 00000000..a8646c6c Binary files /dev/null and b/tests/regression/throwntogethertest/offset-tests-expected.png differ