如何在Blender Python中切换上下文以获取选中对象?
解决Blender脚本中获取选中对象的问题
首先明确:bpy.data里没有直接返回选中对象的方法或属性。因为选中状态是属于视图层(View Layer)的上下文状态,不是bpy.data存储的静态数据块属性——bpy.data只负责存储所有加载到Blender里的资源(对象、材质、网格等),不管这些资源是否被选中。
针对你遇到的脚本运行时bpy.context.selected_objects不存在的问题,给你几个可行的解决方案:
直接指定视图层获取选中对象
不管脚本运行的上下文如何,只要明确指定场景的视图层,就能拿到该视图层下的选中对象:# 获取当前场景的第一个视图层(通常就是默认视图层)的选中对象 selected_objs = bpy.context.scene.view_layers[0].selected_objects如果你的文件有多个视图层,替换索引或者用视图层名称即可(比如
view_layers["ViewLayer"])。遍历对象检查选中状态
每个对象都有select_get()方法,用来判断它是否在当前活跃视图层被选中。你可以遍历所有对象筛选出选中的:selected_objs = [obj for obj in bpy.data.objects if obj.select_get()]这个方法在后台运行脚本(比如命令行批量处理)时也能正常工作。
临时覆盖上下文(针对运算符场景)
如果你是在自定义运算符里遇到上下文问题,可以用temp_override()临时指定上下文参数,确保能访问到选中对象:import bpy class SimpleOperator(bpy.types.Operator): bl_idname = "object.simple_operator" bl_label = "Simple Object Operator" def execute(self, context): # 临时覆盖上下文为当前场景和视图层 with context.temp_override(scene=context.scene, view_layer=context.scene.view_layers[0]): selected_objs = context.selected_objects # 后续处理逻辑 return {'FINISHED'}
内容的提问来源于stack exchange,提问作者Jonathan Sundberg
相关产品推荐
相关产品推荐

