Source code for blenderproc.python.modules.constructor.BasicMeshInitializer

import bpy

from blenderproc.python.modules.main.Module import Module
from blenderproc.python.modules.utility.Config import Config


[docs]class BasicMeshInitializer(Module): """ Adds/initializes basic mesh objects in the scene. Allows setting the basic attribute values. Can initialize a default 'Principled BSDF' shader-based material for each of added objects. For more precise and powerful object manipulation use manipulators.EntityManipulator module. Example 1: Add a plane "Ground_plane" object to the scene. .. code-block:: yaml { "module": "constructor.BasicMeshInitializer", "config": { "meshes_to_add": [ { "type": "plane", "name": "Ground_plane" } ] } } Example 2: Add a rotated "Cube_1" cube object, a displaced "Torus_2" torus object, and a scaled "Cone_3" cone object to the scene. .. code-block:: yaml { "module": "constructor.BasicMeshInitializer", "config": { "meshes_to_add": [ { "type": "cube", "name": "Cube_1", "rotation": [1.1, 0.2, 0.2] }, { "type": "torus", "name": "Torus_2", "location": [0, 0, 3] }, { "type": "cone", "name": "Cone_3", "scale": [2, 3, 4] } ] } } **Configuration**: .. list-table:: :widths: 25 100 10 :header-rows: 1 * - Parameter - Description - Type * - meshes_to_add - List that contains object configuration data in each cell. See table below for available parameters per cell. - list * - init_materials - Flag that controls whether the added objects will be assigned a default Principled BSDF shader-based material (if value is True), or not (if value is False). Material's name is derived from the object's name. Default: True. - boolean **meshes_to_add cell configuration**: .. list-table:: :widths: 25 100 10 :header-rows: 1 * - Parameter - Description - Type * - type - Type of mesh object to add. Available types: 'plane', 'cube', 'circle', 'uvsphere', 'icosphere', 'cylinder', 'cone', 'torus'. - string * - name - Name of the mesh object. - string * - location - Location of the mesh object. Default: [0, 0, 0]. - mathutils.Vector * - rotation - Rotation (3 Euler angles) of the mesh object. Default: [0, 0, 0]. - mathutils.Vector * - scale - Scale of the mesh object. Default: [1, 1, 1]. - mathutils.Vector """ def __init__(self, config): Module.__init__(self, config)
[docs] def run(self): """ Adds specified basic mesh objects to the scene and sets at least their names to the user-defined ones. 1. Get configuration parameters' values. 2. Add an object. 3. Set attribute values. 4. Initialize a material, if needed. """ meshes_to_add = self.config.get_list("meshes_to_add") init_objs_mats = self.config.get_bool("init_materials", True) for mesh in meshes_to_add: mesh_conf = Config(mesh) obj_type = mesh_conf.get_string("type") obj_name = mesh_conf.get_string("name") obj_location = mesh_conf.get_vector3d("location", [0, 0, 0]) obj_rotation = mesh_conf.get_vector3d("rotation", [0, 0, 0]) obj_scale = mesh_conf.get_vector3d("scale", [1, 1, 1]) new_obj = self._add_obj(obj_type) self._set_attrs(new_obj, obj_name, obj_location, obj_rotation, obj_scale) if init_objs_mats: self._init_material(obj_name)
[docs] def _add_obj(self, obj_type): """ Adds an object to the scene. :param obj_type: Type of the object to add. Type: string. :return: Added object. Type: bpy.types.Object. """ if obj_type == "plane": bpy.ops.mesh.primitive_plane_add() elif obj_type == "cube": bpy.ops.mesh.primitive_cube_add() elif obj_type == "circle": bpy.ops.mesh.primitive_circle_add() elif obj_type == "uvsphere": bpy.ops.mesh.primitive_uv_sphere_add() elif obj_type == "icosphere": bpy.ops.mesh.primitive_ico_sphere_add() elif obj_type == "cylinder": bpy.ops.mesh.primitive_cylinder_add() elif obj_type == "cone": bpy.ops.mesh.primitive_cone_add() elif obj_type == "torus": bpy.ops.mesh.primitive_torus_add() else: raise RuntimeError('Unknown basic mesh type "{}"! Available types: "plane", "cube", "circle", "uvsphere", ' '"icosphere", "cylinder", "cone", "torus".'.format(type)) new_obj = bpy.context.object return new_obj
[docs] def _set_attrs(self, new_obj, obj_name, obj_location, obj_rotation, obj_scale): """ Sets the attribute values of the added object. :param new_obj: New object to modify. Type: bpy.types.Object. :param obj_name: Name of the object. Type: string. :param obj_location: XYZ location of the object. Type: mathutils.Vector. :param obj_rotation: Rotation (3 Euler angles) of the object. Type: mathutils.Vector. :param obj_scale: Scale of the object. Type: mathutils.Vector. """ new_obj.name = obj_name new_obj.location = obj_location new_obj.rotation_euler = obj_rotation new_obj.scale = obj_scale
[docs] def _init_material(self, obj_name): """ Adds a new default material and assigns it to the added mesh object. :param obj_name: Name of the object. Type: string. """ mat_obj = bpy.data.materials.new(name=obj_name+"_material") mat_obj.use_nodes = True bpy.context.object.data.materials.append(mat_obj)