import hashlib import json import os import sys import tempfile import bpy def layer_state(grease_pencil): return { "layerOrder": [layer.name for layer in grease_pencil.layers], "framesByLayer": { layer.name: sorted(frame.frame_number for frame in layer.frames) for layer in grease_pencil.layers }, } def main(): arguments = sys.argv[sys.argv.index("--") + 1 :] if "--" in sys.argv else [] if len(arguments) != 2: raise SystemExit("usage: blender -b fixture.blend --python generate-grease-pencil-reorder-golden.py -- fixture.blend output.json") fixture = os.path.abspath(arguments[0]) output = os.path.abspath(arguments[1]) grease_pencil = bpy.data.grease_pencils.get("GreasePencilData") if grease_pencil is None or len(grease_pencil.layers) != 1: raise RuntimeError("GreasePencilData fixture must contain exactly one source layer") source = layer_state(grease_pencil) layer = grease_pencil.layers.new("Web Drafts", set_active=True) layer.frames.new(1) before = layer_state(grease_pencil) grease_pencil.layers.move(layer, "DOWN") moved = layer.frames.move(1, 12) if moved is None: raise RuntimeError("Blender refused the Grease Pencil frame move") after = layer_state(grease_pencil) with tempfile.TemporaryDirectory(prefix="m9-08-grease-pencil-reorder-") as temporary: saved = os.path.join(temporary, "grease-pencil-reorder.blend") bpy.ops.wm.save_as_mainfile(filepath=saved, check_existing=False) bpy.ops.wm.open_mainfile(filepath=saved) reopened = layer_state(bpy.data.grease_pencils["GreasePencilData"]) with open(fixture, "rb") as source_file: fixture_sha256 = hashlib.sha256(source_file.read()).hexdigest() payload = { "schemaVersion": 1, "fixture": "tests/files/web/modifier_grease_pencil_scene.blend", "fixtureSha256": fixture_sha256, "blenderVersion": ".".join(str(value) for value in bpy.app.version), "greasePencilName": "GreasePencilData", "source": source, "beforeReorder": before, "afterReorder": after, "reopened": reopened, } with open(output, "w", encoding="utf-8") as destination: json.dump(payload, destination, indent=2, sort_keys=True) destination.write("\n") if __name__ == "__main__": main()