def _create(self, name=None): if not name: name = np.random.choice(self.names) # if exists make a copy else import _num_images = len(bpy.data.images) _obj = [ x for x in bpy.data.objects if name.split('.')[0] + '.' in x.name ] if len(_obj) > 0: deselect_all() select(_obj[0]) bpy.ops.object.duplicate_move() ind = [ x.name for x in bpy.data.objects if name.split('.')[0] + '.' in x.name ] return bpy.context.scene.objects[ind[-1]] else: bpy.ops.import_scene.obj( filepath='{}/{}/{}'.format(MODULE_PATH, self.name, name)) bpy.context.selected_objects[0].name = name.split('.')[0] self.mesh = bpy.context.selected_objects[0] if not MODULES[self.name]['materials'] or \ _num_images == len(bpy.data.images): self._remove_material() self._triangulate() return self.mesh #bpy.context.selected_objects[0]
def render(self, filename='new_mask_test'): """ Function that performs all the rendering steps: normal render, segmentation mask. :param filename: name of the file, str :return: """ deselect_all(True) bpy.ops.view3d.camera_to_view_selected() deselect_all() self.mask_tree.connect() self._render(filename) self._render_mask(filename) self.depth_tree.connect() bpy.ops.render.render() self._render_depth(filename) if RENDER_EXR: self.depth_tree.connect_root() bpy.ops.render.render() self._render_exr(filename) self.norm_tree.connect() bpy.ops.render.render() self._render_normals(filename)
def save(self, filename='test', ext='obj'): """ Function that saves the building as a separate file. :param filename: name of the file to write without extension, str, default='test' :param ext: file extension, str, default='obj' :return: """ deselect_all() for v in self.volumes: v.mesh.select_set(True) if not MODEL_SAVE in os.listdir(file_dir): os.mkdir(file_dir + '/' + MODEL_SAVE) if ext == 'obj': bpy.ops.export_scene.obj(filepath='{}/Models/{}.{}'.format( file_dir, filename, ext), use_selection=False) elif ext == 'ply': bpy.ops.export_mesh.ply(filepath='{}/{}/{}.{}'.format( file_dir, CLOUD_SAVE, filename, ext), use_selection=False) bpy.ops.export_mesh.ply(filepath='{}/{}/{}_p.{}'.format( file_dir, CLOUD_SAVE, filename, ext), use_selection=False) else: return NotImplementedError
def demolish(self): for _mesh in bpy.data.collections['Building'].objects: try: deselect_all() _mesh.select_set(True) bpy.ops.object.delete() except Exception: pass
def _nest_camera(self): deselect_all() bpy.data.collections['Collection'].objects.link(self.camera) deselect_all() self.camera.select_set(True) bpy.ops.collection.objects_remove(collection='Building') # bpy.data.collections['Building'].objects.unlink(self.camera) return bpy.data.collections['Collection']
def _extrude(self): """ Function that extrudes the plane in order to create a mesh. :return: """ deselect_all() if self.mesh: extrude(self.mesh, self.height)
def _nest(self): deselect_all() names = [x.name for x in bpy.data.collections] if self.name not in names: bpy.data.collections.new(self.name) bpy.data.collections['Building'].children.link(bpy.data.collections[self.name]) bpy.data.collections[self.name].objects.link(bpy.data.objects[self.mesh.name]) return bpy.data.collections[self.name]
def render(self, filename='new_mask_test'): """ Function that performs all the rendering steps: normal render, segmentation mask. :param filename: name of the file, str :return: """ _ = CustomNodeTree(self.mode).make() deselect_all(True) bpy.ops.view3d.camera_to_view_selected() deselect_all() self._render(filename) self._render_mask(filename)
def create(self): """ Function that creates a mesh based on the input parameters. :return: """ bpy.ops.mesh.primitive_plane_add(location=self.position) bpy.ops.transform.resize(value=(self.length, self.width, 1.0)) bpy.context.selected_objects[0].name = 'volume' self.name = bpy.context.selected_objects[0].name self.mesh = bpy.data.objects[self.name] self._nest() self._extrude() self.mesh["inst_id"] = 1 # instance id for the building envelope self.mesh.pass_index = 1 deselect_all() self._triangulate()
def __copy__(self): deselect_all() select(self.mesh) bpy.ops.object.duplicate_move() _name = self.mesh.name.split('.')[0] ind = [ x.name for x in bpy.data.objects if _name + '.' in x.name or _name == x.name ] mesh = bpy.data.objects[ind[-1]] m = self.__class__(self.name, scale=self.scale, mesh=mesh, volume=self.volume) # self._triangulate() if self.connector: m.connect(self.connector.axis, self.connector.side) return m
def _nest(self): deselect_all() postfix = '_0' if '.' in self.volume.name: postfix = '.{}'.format(self.volume.name.split('.')[-1]) if '.' in self.name: self.name = self.name.split('.') _name = self.name + postfix if _name not in [ x.name for x in bpy.data.collections[self.volume.name].children ]: bpy.data.collections.new(_name) _name = [x.name for x in bpy.data.collections if _name in x.name][-1] bpy.data.collections[self.volume.name].children.link( bpy.data.collections[_name]) bpy.data.collections[_name].objects.link( bpy.data.objects[self.mesh.name]) return bpy.data.collections[_name]
def _triangulate(self): deselect_all() if self.mesh: select(self.mesh) bpy.ops.object.modifier_add(type='TRIANGULATE') bpy.ops.object.modifier_apply()
def remove(self): deselect_all() bpy.data.objects[self.mesh.name].select_set(True) with redirect_stdout(stdout), redirect_stderr(stdout): bpy.ops.object.delete()