Layout 双视口固定

自动切到 Layout 工作区,左侧固定为相机渲染视图,右侧固定为 Solid 透视视图,并设置 Cycles 预览参数。

做什么

用法

在 Blender 里 Scripting 工作区打开下方脚本,或 Text Editor → Open 加载 layout-viewports.py,点击 Run Script
分屏效果

源码

import bpy

def setup_layout_viewports_fixed():
    # 确保在 Object 模式
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT')

    # 1. 基础场景清理与 Cycles 渲染设置
    if "Cube" in bpy.data.objects:
        bpy.data.objects.remove(bpy.data.objects["Cube"], do_unlink=True)
    
    bpy.context.scene.render.film_transparent = True
    bpy.context.scene.render.engine = 'CYCLES'
    bpy.context.scene.cycles.device = 'GPU'
    bpy.context.scene.cycles.use_denoising = True
    bpy.context.scene.cycles.preview_samples = 10
    bpy.context.scene.cycles.samples = 10

    # 2. 找到并切换到 Layout 工作区
    layout_workspace = bpy.data.workspaces.get("Layout")
    if layout_workspace:
        bpy.context.window.workspace = layout_workspace
        bpy.context.view_layer.update()
    else:
        print("未找到名为 'Layout' 的工作区。")
        return

    # 3. 获取 Layout 工作区对应的 screen
    window = bpy.context.window
    screen = layout_workspace.screens[0] if layout_workspace.screens else window.screen
    view_3d_areas = [area for area in screen.areas if area.type == 'VIEW_3D']

    # 如果 Layout 里只有一个大视口,则执行切分
    if len(view_3d_areas) == 1:
        original_area = view_3d_areas[0]
        
        # 记住切分前原始视口的 ID 
        original_area_id = original_area.as_pointer()
        
        # 强制执行分屏(Blender 默认会把新生成的视口放在右边,并激活它)
        with bpy.context.temp_override(window=window, screen=screen, area=original_area, region=original_area.regions[0]):
            bpy.ops.screen.area_split(direction='VERTICAL', factor=0.5)
            
        # 重新获取 Layout 里的 3D 视口
        new_view_3d_areas = [area for area in screen.areas if area.type == 'VIEW_3D']
        
        # 找出哪个是原来的(左边),哪个是新生成的(右边)
        left_area = None
        right_area = None
        
        for area in new_view_3d_areas:
            if area.as_pointer() == original_area_id:
                left_area = area
            else:
                right_area = area

        # 4. 精准配置左右视口
        if left_area and right_area:
            left_space = left_area.spaces.active
            right_space = right_area.spaces.active
            
            # 左边:渲染模式 + 摄像机
            right_space.shading.type = 'RENDERED'
            right_space.region_3d.view_perspective = 'CAMERA'
            
            # 右边:Solid模式 + 透视
            left_space.shading.type = 'SOLID'
            left_space.region_3d.view_perspective = 'PERSP'
            
            print("【成功】左边已固定为相机渲染,右边已固定为Solid模式。")
            return

    # 如果原本就是多窗口状态,直接通过 X 坐标兜底强制刷一遍
    view_3d_areas = [area for area in screen.areas if area.type == 'VIEW_3D']
    view_3d_areas.sort(key=lambda a: a.x)
    
    if len(view_3d_areas) >= 2:
        view_3d_areas[0].spaces.active.shading.type = 'RENDERED'
        view_3d_areas[0].spaces.active.region_3d.view_perspective = 'CAMERA'
        
        view_3d_areas[1].spaces.active.shading.type = 'SOLID'
        view_3d_areas[1].spaces.active.region_3d.view_perspective = 'PERSP'
        print("【兜底成功】已通过坐标强制修正:左边渲染相机,右边Solid。")

if __name__ == "__main__":
    setup_layout_viewports_fixed()