Add concat() builtin (fixes #201).

This allows to concatenate multiple vectors and single elements into a
single result vector.
vector-concat
Torsten Paul 2013-12-26 05:01:40 +01:00
parent 41ab9e8ab6
commit 6443df394b
4 changed files with 117 additions and 0 deletions

2
.gitignore vendored
View File

@ -12,4 +12,6 @@ parser_yacc.h
/tmp
/OpenSCAD.app
*/#*#
/nbproject
/openscad
/tests/openscad_nogui

View File

@ -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));

View File

@ -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));

View File

@ -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]]