You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:24:13