trimesh.iteration module¶
- trimesh.iteration.chain(*args: Iterable[Any] | Any | None) list[Any] ¶
A less principled version of list(itertools.chain(*args)) that accepts non-iterable values, filters None, and returns a list rather than yielding values.
If all passed values are iterables this will return identical results to list(itertools.chain(*args)).
Examples
In [1]: list(itertools.chain([1,2], [3])) Out[1]: [1, 2, 3]
In [2]: trimesh.util.chain([1,2], [3]) Out[2]: [1, 2, 3]
In [3]: trimesh.util.chain([1,2], [3], 4) Out[3]: [1, 2, 3, 4]
- In [4]: list(itertools.chain([1,2], [3], 4))
—-> 1 list(itertools.chain([1,2], [3], 4)) TypeError: ‘int’ object is not iterable
In [5]: trimesh.util.chain([1,2], None, 3, None, [4], [], [], 5, []) Out[5]: [1, 2, 3, 4, 5]
- Parameters:
args – Will be individually checked to see if they’re iterable before either being appended or extended to a flat list.
- Returns:
The values in a flat list.
- Return type:
chained
- trimesh.iteration.reduce_cascade(operation: Callable, items: Sequence | ndarray[tuple[int, ...], dtype[_ScalarType_co]])¶
Call an operation function in a cascaded pairwise way against a flat list of items.
This should produce the same result as functools.reduce if operation is commutable like addition or multiplication. This may be faster for an operation that runs with a speed proportional to its largest input, which mesh booleans appear to.
The union of a large number of small meshes appears to be “much faster” using this method.
This only differs from functools.reduce for commutative operation in that it returns None on empty inputs rather than functools.reduce which raises a TypeError.
- For example on a b c d e f g this function would run and return:
a b c d e f ab cd ef g abcd efg
-> abcdefg
- Where functools.reduce would run and return:
a b ab c abc d abcd e abcde f abcdef g
-> abcdefg
- Parameters:
operation – The function to call on pairs of items.
items – The flat list of items to apply operation against.