summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--src/func.cc19
-rw-r--r--testdata/scad/functions/concat-tests.scad53
-rw-r--r--tests/regression/echotest/concat-tests-expected.echo43
4 files changed, 117 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 59bac49..040fe53 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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]]
contact: Jan Huwald // Impressum