Source code for trimesh.path.exchange.load
from ... import util
from ...exceptions import ExceptionWrapper
from ...exchange.ply import load_ply
from ...typed import Optional, Set
from ..path import Path
from . import misc
from .dxf import _dxf_loaders
from .svg_io import _svg_loaders
[docs]
def load_path(file_obj, file_type: Optional[str] = None, **kwargs):
"""
Load a file to a Path file_object.
Parameters
-----------
file_obj
Accepts many types:
- Path, Path2D, or Path3D file_objects
- open file file_object (dxf or svg)
- file name (dxf or svg)
- shapely.geometry.Polygon
- shapely.geometry.MultiLineString
- dict with kwargs for Path constructor
- `(n, 2, (2|3)) float` line segments
file_type
Type of file is required if file
object is passed.
Returns
---------
path : Path, Path2D, Path3D file_object
Data as a native trimesh Path file_object
"""
# avoid a circular import
from ...exchange.load import _load_kwargs, _parse_file_args
arg = _parse_file_args(file_obj=file_obj, file_type=file_type, **kwargs)
if isinstance(file_obj, Path):
# we have been passed a file object that is already a loaded
# trimesh.path.Path object so do nothing and return
return file_obj
elif util.is_file(arg.file_obj):
if arg.file_type in path_loaders:
kwargs.update(
path_loaders[arg.file_type](
file_obj=arg.file_obj, file_type=arg.file_type
)
)
elif arg.file_type == "ply":
# we cannot register this exporter to path_loaders since
# this is already reserved by Trimesh in ply format in trimesh.load()
kwargs.update(load_ply(file_obj=arg.file_obj, file_type=arg.file_type))
elif util.is_instance_named(file_obj, ["Polygon", "MultiPolygon"]):
# convert from shapely polygons to Path2D
kwargs.update(misc.polygon_to_path(file_obj))
elif util.is_instance_named(file_obj, "MultiLineString"):
# convert from shapely LineStrings to Path2D
kwargs.update(misc.linestrings_to_path(file_obj))
elif isinstance(file_obj, dict):
# load as kwargs
kwargs = file_obj
elif util.is_sequence(file_obj):
# load as lines in space
kwargs.update(misc.lines_to_path(file_obj))
else:
raise ValueError("Not a supported object type!")
# actually load
result = _load_kwargs(kwargs)
result._source = arg
return result
def path_formats() -> Set[str]:
"""
Get a list of supported path formats.
Returns
------------
loaders
Extensions of loadable formats, i.e. {'svg', 'dxf'}
"""
return {k for k, v in path_loaders.items() if not isinstance(v, ExceptionWrapper)}
path_loaders = {}
path_loaders.update(_svg_loaders)
path_loaders.update(_dxf_loaders)