{ "$schema": "../_schema.json", "format": "pptx", "element": "model3d", "elementAliases": ["glb", "model", "3dmodel"], "parent": "slide", "operations": { "add": true, "set": true, "get": true, "query": true, "remove": true }, "paths": { "positional": ["/slide[N]/model3d[M]"] }, "note": "Only .glb (glTF-Binary) accepted. Placeholder PNG auto-generated for non-3D-aware viewers. Defaults to 10cm × 10cm centered on the slide.", "properties": { "src": { "type": "string", "description": ".glb source (file path, URL, data-URI). Non-glb rejected. Accepted on add/set only; Get does NOT surface this key (no Format[\"src\"] or Format[\"relId\"] is emitted for model3d).", "aliases": ["path"], "add": true, "set": true, "get": false, "examples": ["--prop src=/path/to/model.glb"], "readback": "add-time only; not surfaced in Get.", "enforcement": "report" }, "x": { "type": "length", "aliases": ["left"], "add": true, "set": true, "get": true, "examples": ["--prop x=2cm"], "readback": "length in cm (e.g. \"2cm\")", "enforcement": "report" }, "y": { "type": "length", "aliases": ["top"], "add": true, "set": true, "get": true, "examples": ["--prop y=2cm"], "readback": "length in cm (e.g. \"2cm\")", "enforcement": "report" }, "width": { "type": "length", "add": true, "set": true, "get": true, "examples": ["--prop width=10cm"], "readback": "length in cm (e.g. \"2cm\")", "enforcement": "report" }, "height": { "type": "length", "add": true, "set": true, "get": true, "examples": ["--prop height=10cm"], "readback": "length in cm (e.g. \"2cm\")", "enforcement": "report" }, "rotation": { "type": "string", "description": "Model rotation as comma-separated degrees \"ax,ay,az\" (X, Y, Z axes). Missing axes default to 0. Per-axis aliases rotx/roty/rotz also accepted on set.", "aliases": ["rotx", "roty", "rotz"], "add": true, "set": true, "get": true, "examples": ["--prop rotation=30,45,0", "--prop rotx=30"], "readback": "\"ax,ay,az\" degrees (e.g. \"30,45,0\")", "enforcement": "report" } } }