mirror of https://github.com/vitalif/openscad
Add concat() builtin (fixes #201).
This allows to concatenate multiple vectors and single elements into a single result vector.vector-concat
parent
41ab9e8ab6
commit
6443df394b
|
@ -12,4 +12,6 @@ parser_yacc.h
|
|||
/tmp
|
||||
/OpenSCAD.app
|
||||
*/#*#
|
||||
/nbproject
|
||||
/openscad
|
||||
/tests/openscad_nogui
|
||||
|
|
19
src/func.cc
19
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));
|
||||
|
|
|
@ -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));
|
|
@ -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]]
|
Loading…
Reference in New Issue