"""Read browser-produced blend files and independently import OBJ using Blender.""" import json import pathlib import sys import bpy def vector(values): return [round(float(value), 5) for value in values] def summary(): bpy.context.view_layer.update() return sorted([{ "name": obj.name, "type": obj.type, "location": vector(obj.location), "rotation": vector(obj.rotation_euler), "scale": vector(obj.scale), "vertices": [vector(vertex.co) for vertex in obj.data.vertices] if obj.type == "MESH" else [], "faces": [list(face.vertices) for face in obj.data.polygons] if obj.type == "MESH" else [], } for obj in bpy.data.objects], key=lambda item: item["name"]) def geometry(): bpy.context.view_layer.update() return sorted([{ "vertices": sorted(vector(obj.matrix_world @ vertex.co) for vertex in obj.data.vertices), "faces": len(obj.data.polygons), } for obj in bpy.data.objects if obj.type == "MESH"], key=lambda item: json.dumps(item, sort_keys=True)) directory, fixture, source = sys.argv[sys.argv.index("--") + 1:] directory = pathlib.Path(directory) states = {} for blend in sorted(directory.glob("*.blend")): bpy.ops.wm.open_mainfile(filepath=str(blend)) states[blend.stem] = summary() if blend.stem == "after": states["afterGeometry"] = geometry() bpy.ops.wm.open_mainfile(filepath=fixture) assert bpy.ops.wm.obj_import(filepath=source) == {"FINISHED"} states["desktopExpected"] = summary() bpy.ops.wm.read_factory_settings(use_empty=True) assert bpy.ops.wm.obj_import(filepath=str(directory / "exported.obj")) == {"FINISHED"} states["exportedGeometry"] = geometry() (directory / "native.json").write_text(json.dumps(states, sort_keys=True, indent=2) + "\n")