diff options
| author | skal <pascal.massimino@gmail.com> | 2026-03-22 08:04:24 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-03-22 08:04:24 +0100 |
| commit | 3db63790c5954c304dfe5822cdbd337e02b4fab5 (patch) | |
| tree | fa6a633b414875045386b81f613608b4bc9217a2 /cnn_v3/training | |
| parent | 0c7bd063285a052eb7cd48b8a5c0c8dd203c7409 (diff) | |
fix(cnn_v3): blender_export --view-layer flag + fallback to layer[0]
Fixes KeyError when blend file uses a non-default view layer name.
Adds --view-layer NAME arg; pass '?' to list available layers.
Defaults to index 0 with a clear error if the name is not found.
handoff(Gemini): blender_export.py view layer selection now robust
Diffstat (limited to 'cnn_v3/training')
| -rw-r--r-- | cnn_v3/training/blender_export.py | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/cnn_v3/training/blender_export.py b/cnn_v3/training/blender_export.py index 63dd0e3..5d07c26 100644 --- a/cnn_v3/training/blender_export.py +++ b/cnn_v3/training/blender_export.py @@ -6,6 +6,12 @@ then renders the current scene to a multi-layer EXR. Usage (headless): blender -b scene.blend -P blender_export.py -- --output renders/frame_### + # List available view layers in the blend file: + blender -b scene.blend -P blender_export.py -- --view-layer ? + + # Use a specific view layer: + blender -b scene.blend -P blender_export.py -- --output renders/frame_### --view-layer "MyLayer" + Each '#' in the output path is replaced by Blender with the frame number (zero-padded). The script writes one multi-layer EXR per frame containing all required passes. @@ -57,6 +63,11 @@ def parse_args(): "--end-frame", type=int, default=None, help="Last frame to render (default: scene end frame)" ) + parser.add_argument( + "--view-layer", default=None, metavar="NAME", + help="View layer name to use (default: first available). " + "Use --view-layer without a value (or pass '?') to list available layers." + ) return parser.parse_args(argv) @@ -77,8 +88,20 @@ def configure_scene(args): # Use Cycles for best multi-pass support scene.render.engine = "CYCLES" - # Enable required render passes on the active view layer - vl = scene.view_layers["ViewLayer"] + # Enable required render passes on the selected view layer + available = list(scene.view_layers.keys()) + if getattr(args, "view_layer", None) in (None, "?"): + if args.view_layer == "?": + print("Available view layers:", available) + sys.exit(0) + vl = scene.view_layers[0] + else: + try: + vl = scene.view_layers[args.view_layer] + except KeyError: + print(f"ERROR: view layer '{args.view_layer}' not found.") + print(f"Available: {available}") + sys.exit(1) vl.use_pass_combined = True # beauty target vl.use_pass_diffuse_color = True # albedo vl.use_pass_normal = True # world normals |
