50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
|
import numpy as np
|
||
|
from ..util import is_ccw # NOQA
|
||
|
|
||
|
|
||
|
def concatenate(paths):
|
||
|
"""
|
||
|
Concatenate multiple paths into a single path.
|
||
|
|
||
|
Parameters
|
||
|
-------------
|
||
|
paths : (n,) Path
|
||
|
Path objects to concatenate
|
||
|
|
||
|
Returns
|
||
|
-------------
|
||
|
concat : Path, Path2D, or Path3D
|
||
|
Concatenated result
|
||
|
"""
|
||
|
# if only one path object just return copy
|
||
|
if len(paths) == 1:
|
||
|
return paths[0].copy()
|
||
|
|
||
|
# length of vertex arrays
|
||
|
vert_len = np.array([len(i.vertices) for i in paths])
|
||
|
# how much to offset each paths vertex indices by
|
||
|
offsets = np.append(0.0, np.cumsum(vert_len))[:-1].astype(np.int64)
|
||
|
|
||
|
# resulting entities
|
||
|
entities = []
|
||
|
# resulting vertices
|
||
|
vertices = []
|
||
|
# resulting metadata
|
||
|
metadata = {}
|
||
|
for path, offset in zip(paths, offsets):
|
||
|
# update metadata
|
||
|
metadata.update(path.metadata)
|
||
|
# copy vertices, we will stack later
|
||
|
vertices.append(path.vertices.copy())
|
||
|
# copy entity then reindex points
|
||
|
for entity in path.entities:
|
||
|
entities.append(entity.copy())
|
||
|
entities[-1].points += offset
|
||
|
|
||
|
# generate the single new concatenated path
|
||
|
# use input types so we don't have circular imports
|
||
|
concat = type(path)(metadata=metadata,
|
||
|
entities=entities,
|
||
|
vertices=np.vstack(vertices))
|
||
|
return concat
|