Source code for blenderproc.python.loader.ObjectLoader

import os
from typing import List, Optional, Dict

import bpy

from blenderproc.python.types.MeshObjectUtility import MeshObject, convert_to_meshes


[docs]def load_obj(filepath: str, cached_objects: Optional[Dict[str, List[MeshObject]]] = None, **kwargs) -> List[MeshObject]: """ Import all objects for the given file and returns the loaded objects In .obj files a list of objects can be saved in. In .ply files only one object can saved so the list has always at most one element :param filepath: the filepath to the location where the data is stored :param cached_objects: a dict of filepath to objects, which have been loaded before, to avoid reloading (the dict is updated in this function) :param kwargs: all other params are handed directly to the bpy loading fct. check the corresponding documentation :return: The list of loaded mesh objects. """ if os.path.exists(filepath): if cached_objects is not None and isinstance(cached_objects, dict): if filepath in cached_objects.keys(): created_obj = [] for obj in cached_objects[filepath]: # duplicate the object created_obj.append(obj.duplicate()) return created_obj else: loaded_objects = load_obj(filepath, cached_objects=None, **kwargs) cached_objects[filepath] = loaded_objects return loaded_objects else: # save all selected objects previously_selected_objects = bpy.context.selected_objects if filepath.endswith('.obj'): # load an .obj file: bpy.ops.import_scene.obj(filepath=filepath, **kwargs) elif filepath.endswith('.ply'): # load a .ply mesh bpy.ops.import_mesh.ply(filepath=filepath, **kwargs) # add a default material to ply file mat = bpy.data.materials.new(name="ply_material") mat.use_nodes = True selected_objects = [obj for obj in bpy.context.selected_objects if obj not in previously_selected_objects] for obj in selected_objects: obj.data.materials.append(mat) elif filepath.endswith('.dae'): bpy.ops.wm.collada_import(filepath=filepath) elif filepath.lower().endswith('.stl'): # load a .stl file bpy.ops.import_mesh.stl(filepath=filepath, **kwargs) # add a default material to stl file mat = bpy.data.materials.new(name="stl_material") mat.use_nodes = True selected_objects = [obj for obj in bpy.context.selected_objects if obj not in previously_selected_objects] for obj in selected_objects: obj.data.materials.append(mat) return convert_to_meshes( [obj for obj in bpy.context.selected_objects if obj not in previously_selected_objects]) else: raise Exception("The given filepath does not exist: {}".format(filepath))