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.