import json import os import sys import bpy def mesh_object(name, x): mesh = bpy.data.meshes.new(f"{name}Mesh") mesh.from_pydata( [(-1, -1, -1), (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, 1), (1, -1, 1), (1, 1, 1), (-1, 1, 1)], [], [(0, 1, 2, 3), (4, 7, 6, 5), (0, 4, 5, 1), (1, 5, 6, 2), (2, 6, 7, 3), (4, 0, 3, 7)], ) obj = bpy.data.objects.new(name, mesh) obj.location.x = x bpy.context.scene.collection.objects.link(obj) return obj def main(output_dir): bpy.ops.wm.read_factory_settings(use_empty=True) cycle_a = mesh_object("CycleA", -3) cycle_b = mesh_object("CycleB", 3) missing = mesh_object("MissingTarget", 0) ordered = mesh_object("OrderedStack", 0) ordered.location.y = 4 shrink_a = cycle_a.modifiers.new("Cycle A to B", "SHRINKWRAP") shrink_a.target = cycle_b shrink_a.show_viewport = True shrink_a.show_render = False shrink_a.show_in_editmode = True shrink_a.show_on_cage = False shrink_b = cycle_b.modifiers.new("Cycle B to A", "SHRINKWRAP") shrink_b.target = cycle_a shrink_b.show_viewport = True shrink_b.show_render = True shrink_b.show_in_editmode = False shrink_b.show_on_cage = True missing.modifiers.new("Missing Lattice Target", "LATTICE") mirror = ordered.modifiers.new("Ordered Mirror", "MIRROR") mirror.show_viewport = True mirror.show_render = True mirror.show_in_editmode = True mirror.show_on_cage = True bevel = ordered.modifiers.new("Ordered Bevel", "BEVEL") bevel.width = 0.1 bevel.segments = 2 bevel.show_viewport = False bevel.show_render = True bevel.show_in_editmode = False bevel.show_on_cage = False scene = bpy.context.scene scene.frame_start = 1 scene.frame_end = 10 output_path = os.path.join(output_dir, "modifier_dependency_cycle.blend") bpy.ops.wm.save_as_mainfile(filepath=output_path) golden = { "taskId": "N-002", "blenderVersion": bpy.app.version_string, "fixture": os.path.basename(output_path), "cycleObjects": ["CycleA", "CycleB"], "missingTarget": {"object": "MissingTarget", "modifier": "Missing Lattice Target"}, "orderedStack": {"object": "OrderedStack", "modifiers": ["Ordered Mirror", "Ordered Bevel"]}, } golden_dir = os.path.join(os.path.dirname(output_dir), "..", "golden", "N-002") os.makedirs(golden_dir, exist_ok=True) with open(os.path.join(golden_dir, "modifier_dependency_cycle.json"), "w", encoding="utf-8") as handle: json.dump(golden, handle, indent=2, sort_keys=True) handle.write("\n") if __name__ == "__main__": args = sys.argv[sys.argv.index("--") + 1:] main(os.path.abspath(args[0]))