diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | src/func.cc | 19 | ||||
-rw-r--r-- | testdata/scad/functions/concat-tests.scad | 53 | ||||
-rw-r--r-- | tests/regression/echotest/concat-tests-expected.echo | 43 |
4 files changed, 117 insertions, 0 deletions
@@ -12,4 +12,6 @@ parser_yacc.h /tmp /OpenSCAD.app */#*# +/nbproject /openscad +/tests/openscad_nogui diff --git a/src/func.cc b/src/func.cc index 4587f72..23292df 100644 --- a/src/func.cc +++ b/src/func.cc @@ -343,6 +343,24 @@ Value builtin_str(const Context *, const EvalContext *evalctx) return Value(stream.str()); } +Value builtin_concat(const Context *, const EvalContext *evalctx) +{ + Value::VectorType result; + + for (size_t i = 0; i < evalctx->numArgs(); i++) { + const Value v = evalctx->getArgValue(i); + if (v.type() == Value::VECTOR) { + Value::VectorType vec = v.toVector(); + for (Value::VectorType::const_iterator it = vec.begin(); it != vec.end(); it++) { + result.push_back(*it); + } + } else { + result.push_back(v); + } + } + return Value(result); +} + Value builtin_lookup(const Context *, const EvalContext *evalctx) { double p, low_p, low_v, high_p, high_v; @@ -604,6 +622,7 @@ void register_builtin_functions() Builtins::init("log", new BuiltinFunction(&builtin_log)); Builtins::init("ln", new BuiltinFunction(&builtin_ln)); Builtins::init("str", new BuiltinFunction(&builtin_str)); + Builtins::init("concat", new BuiltinFunction(&builtin_concat)); Builtins::init("lookup", new BuiltinFunction(&builtin_lookup)); Builtins::init("search", new BuiltinFunction(&builtin_search)); Builtins::init("version", new BuiltinFunction(&builtin_version)); diff --git a/testdata/scad/functions/concat-tests.scad b/testdata/scad/functions/concat-tests.scad new file mode 100644 index 0000000..0bcb903 --- /dev/null +++ b/testdata/scad/functions/concat-tests.scad @@ -0,0 +1,53 @@ +u = undef; + +echo("--- empty"); +echo(concat()); +echo(concat([])); +echo(concat([], [])); +echo(concat([], [], [])); + +echo("--- single elements"); +echo(concat(u)); +echo(concat(true)); +echo(concat(3)); +echo(concat("abc")); +echo(concat([0:1:10])); + +echo("--- single vectors"); +echo(concat([1, 2, 3])); +echo(concat([[1, 2, 3]])); +echo(concat([[[1, 2, 3]]])); +echo(concat([[[1, 2, [3, 4], 5]]])); + +echo("--- multiple elements"); +echo(concat(3, 3)); +echo(concat(1, 2, 3)); +echo(concat(1, 2, 3, 4, 5)); +echo(concat(1, "text", false, [1:0.5:3])); + +echo("--- vector / element"); +echo(concat([3, 4], u)); +echo(concat([3, 4, 5], 6)); +echo(concat([3, 4, 5, 6], true)); +echo(concat([3, 4, "5", 6], "test")); +echo(concat([3, 4, true, 6], [4:1:3])); + +echo("--- element / vector"); +echo(concat(3, [])); +echo(concat(3, [3, 4])); +echo(concat(true, [3, [4]])); +echo(concat("9", [1, 2, 3])); +echo(concat([6:2:9], [3, [4]])); + +echo("--- vector / vector"); +echo(concat([], [3, 4])); +echo(concat([[]], [3, 4])); +echo(concat([[2, 4]], [3, 4])); +echo(concat([5, 6], ["d", [3, 4]])); +echo(concat([[1, 0, 0], [2, 0, 0]], [3, 0, 0])); +echo(concat([[1, 0, 0], [2, 0, 0]], [[3, 0, 0]])); +echo(concat([[1, 0, 0], [2, 0, 0], [3, 0, 0]], [[4, 4, 4], [5, 5, 5]])); + +echo("--- recursive function"); +function r(i) = i > 0 ? concat(r(i - 1), [[i, i * i]]) : []; +echo(r(10)); diff --git a/tests/regression/echotest/concat-tests-expected.echo b/tests/regression/echotest/concat-tests-expected.echo new file mode 100644 index 0000000..58b41d0 --- /dev/null +++ b/tests/regression/echotest/concat-tests-expected.echo @@ -0,0 +1,43 @@ +ECHO: "--- empty" +ECHO: [] +ECHO: [] +ECHO: [] +ECHO: [] +ECHO: "--- single elements" +ECHO: [undef] +ECHO: [true] +ECHO: [3] +ECHO: ["abc"] +ECHO: [[0 : 1 : 10]] +ECHO: "--- single vectors" +ECHO: [1, 2, 3] +ECHO: [[1, 2, 3]] +ECHO: [[[1, 2, 3]]] +ECHO: [[[1, 2, [3, 4], 5]]] +ECHO: "--- multiple elements" +ECHO: [3, 3] +ECHO: [1, 2, 3] +ECHO: [1, 2, 3, 4, 5] +ECHO: [1, "text", false, [1 : 0.5 : 3]] +ECHO: "--- vector / element" +ECHO: [3, 4, undef] +ECHO: [3, 4, 5, 6] +ECHO: [3, 4, 5, 6, true] +ECHO: [3, 4, "5", 6, "test"] +ECHO: [3, 4, true, 6, [4 : 1 : 3]] +ECHO: "--- element / vector" +ECHO: [3] +ECHO: [3, 3, 4] +ECHO: [true, 3, [4]] +ECHO: ["9", 1, 2, 3] +ECHO: [[6 : 2 : 9], 3, [4]] +ECHO: "--- vector / vector" +ECHO: [3, 4] +ECHO: [[], 3, 4] +ECHO: [[2, 4], 3, 4] +ECHO: [5, 6, "d", [3, 4]] +ECHO: [[1, 0, 0], [2, 0, 0], 3, 0, 0] +ECHO: [[1, 0, 0], [2, 0, 0], [3, 0, 0]] +ECHO: [[1, 0, 0], [2, 0, 0], [3, 0, 0], [4, 4, 4], [5, 5, 5]] +ECHO: "--- recursive function" +ECHO: [[1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81], [10, 100]] |