Ships the combined filesystem/Supabase storage adapter + MCP scene lifecycle tools + Next.js API routes + editor /scene/[id] route, so an MCP save is directly openable at /scene/<id> without any injection hack. End-to-end verified: 10/10 e2e steps pass. Storage (A1/A2/A3): - SceneStore interface + error classes + slug helpers - FilesystemSceneStore at $PASCAL_DATA_DIR (defaults XDG/~/.pascal) with atomic writes, .index sidecar, optimistic locking - SupabaseSceneStore with scenes + scene_revisions tables, RLS migration SQL, mock-backed unit tests - createSceneStore(env) auto-selects based on SUPABASE_URL + SUPABASE_SERVICE_ROLE_KEY MCP tools (A4, A8, A9, A10): - save_scene / load_scene / list_scenes / delete_scene / rename_scene - list_templates / create_from_template (3 seed templates: empty-studio, two-bedroom, garden-house) - generate_variants (7 mutation kinds, seeded RNG, save=true|false) - photo_to_scene (vision sampling → scene graph → save) Editor (A5, A6): - /api/scenes + /api/scenes/[id] with RFC 7232 If-Match locking - /scene/[id] and /scenes route pages with save button, SceneLoader - Removed the window.__pascalScene dev injection hack Security + UX edges (A7, A8): - AssetUrl Zod validator: asset:// blob: data:image/ /path https: (http://localhost for dev) + PASCAL_ALLOWED_ASSET_ORIGINS env allowlist. Hardens scan.url, guide.url, item.asset.src, material.texture.url, MaterialMaps.*Map - Auto-frame camera on empty→non-empty scene transition (camera-controls:fit-scene emitter event) Shared utilities: - rehydrateSiteChildren() extracted to packages/mcp/src/lib/ and used by both create-from-template and generate-variants to work around the SiteNode.children-as-objects vs. ids inconsistency (CROSS_CUTTING §2) - Storage + MCP subpath exports added to packages/mcp/package.json (CROSS_CUTTING §4) Tests: 293 pass / 0 fail across 40 files (was 142 pre-Phase-7). Biome: clean. Phase-7 e2e script at packages/mcp/test-reports/phase7-e2e.ts: MCP HTTP + editor Next.js both point at $PASCAL_DATA_DIR = /tmp/pascal-e2e, save_scene from MCP, GET /api/scenes/<id> from editor server, /scenes list page renders all saved scenes, scene page renders SceneLoader, delete_scene works. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
837 lines
22 KiB
JSON
837 lines
22 KiB
JSON
{
|
|
"nodes": {
|
|
"site_3ss5ro12ozrgtdbf": {
|
|
"object": "node",
|
|
"id": "site_3ss5ro12ozrgtdbf",
|
|
"type": "site",
|
|
"parentId": null,
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": {
|
|
"type": "polygon",
|
|
"points": [[-15, -15], [15, -15], [15, 15], [-15, 15]]
|
|
},
|
|
"children": [
|
|
{
|
|
"object": "node",
|
|
"id": "building_hhprs7o5kz0q2qo7",
|
|
"type": "building",
|
|
"parentId": null,
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["level_9ded0vdlfag09tdt"],
|
|
"position": [0, 0, 0],
|
|
"rotation": [0, 0, 0]
|
|
}
|
|
]
|
|
},
|
|
"building_hhprs7o5kz0q2qo7": {
|
|
"object": "node",
|
|
"id": "building_hhprs7o5kz0q2qo7",
|
|
"type": "building",
|
|
"parentId": null,
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["level_9ded0vdlfag09tdt"],
|
|
"position": [0, 0, 0],
|
|
"rotation": [0, 0, 0]
|
|
},
|
|
"level_9ded0vdlfag09tdt": {
|
|
"object": "node",
|
|
"id": "level_9ded0vdlfag09tdt",
|
|
"type": "level",
|
|
"parentId": null,
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": [
|
|
"wall_vc5l8mk2b3j3ukvq",
|
|
"wall_9jaybb53j2r5j5en",
|
|
"wall_a16b1eirqz5p9f98",
|
|
"wall_yiwfcyw716g5ql5y",
|
|
"wall_9vmyxyv2kea0t2vn",
|
|
"wall_53gr0rtp1ssmxvz2",
|
|
"wall_yzuosc4u4z0a9jqo",
|
|
"wall_eeogjzcwm711gzam",
|
|
"wall_3mznfrklw8ar7jrz",
|
|
"zone_b51zjgfr0cgc7ncc",
|
|
"zone_x409m2lnw1jpmi8m",
|
|
"zone_and0s1ux5v8rexj6",
|
|
"zone_n8w3oyzr3c4ovcbu",
|
|
"zone_c1wa4cr91h215zzk",
|
|
"zone_e8e6qqmx85tockrm",
|
|
"zone_ebbidjjln9doosy5",
|
|
"zone_av8rfpjgcpmpx4pb",
|
|
"slab_tqyxze2hshzm1it3",
|
|
"fence_hnhjl6vicj3fs234",
|
|
"fence_me6wvw6rf93y2um4",
|
|
"fence_af22csiukvc7gjyf",
|
|
"fence_lp6d7gkrado9z0cc",
|
|
"fence_a09o9w183o453oqh",
|
|
"zone_gtpdocou2nceicp9"
|
|
],
|
|
"level": 0
|
|
},
|
|
"wall_vc5l8mk2b3j3ukvq": {
|
|
"object": "node",
|
|
"id": "wall_vc5l8mk2b3j3ukvq",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": [
|
|
"door_v19tfw6dbg60pjka",
|
|
"door_57wgnpcft27n51ui",
|
|
"window_6lkp36vh0kpe8vsl",
|
|
"window_8klttdg0qbxw0v6h"
|
|
],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-8, 4],
|
|
"end": [4, 4],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_9jaybb53j2r5j5en": {
|
|
"object": "node",
|
|
"id": "wall_9jaybb53j2r5j5en",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["door_lv8wmjjs6em9ayqg", "window_qy4pp3lwyn5cq2u1"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-8, -4],
|
|
"end": [4, -4],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_a16b1eirqz5p9f98": {
|
|
"object": "node",
|
|
"id": "wall_a16b1eirqz5p9f98",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["window_r9mc8jkp0dem9s8u"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-8, -4],
|
|
"end": [-8, 4],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_yiwfcyw716g5ql5y": {
|
|
"object": "node",
|
|
"id": "wall_yiwfcyw716g5ql5y",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["window_bbmwfj9hjxfz6y7c", "window_19otr8qt84hke69s"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [4, -4],
|
|
"end": [4, 4],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_9vmyxyv2kea0t2vn": {
|
|
"object": "node",
|
|
"id": "wall_9vmyxyv2kea0t2vn",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": [],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-1, 0],
|
|
"end": [-1, 4],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_53gr0rtp1ssmxvz2": {
|
|
"object": "node",
|
|
"id": "wall_53gr0rtp1ssmxvz2",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["door_g1ffn08lohho4vf0"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-1, -4],
|
|
"end": [-1, 0],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_yzuosc4u4z0a9jqo": {
|
|
"object": "node",
|
|
"id": "wall_yzuosc4u4z0a9jqo",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["door_zuyuxee4afd5ae0o"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-4, -4],
|
|
"end": [-4, 0],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_eeogjzcwm711gzam": {
|
|
"object": "node",
|
|
"id": "wall_eeogjzcwm711gzam",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": [],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-4, -1],
|
|
"end": [-1, -1],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"wall_3mznfrklw8ar7jrz": {
|
|
"object": "node",
|
|
"id": "wall_3mznfrklw8ar7jrz",
|
|
"type": "wall",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"children": ["door_n4kgjkvq18a87rh0"],
|
|
"thickness": 0.2,
|
|
"height": 2.7,
|
|
"start": [-4, -2],
|
|
"end": [-1, -2],
|
|
"frontSide": "unknown",
|
|
"backSide": "unknown"
|
|
},
|
|
"zone_b51zjgfr0cgc7ncc": {
|
|
"object": "node",
|
|
"id": "zone_b51zjgfr0cgc7ncc",
|
|
"type": "zone",
|
|
"name": "living-dining",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-8, 0], [-1, 0], [-1, 4], [-8, 4]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_x409m2lnw1jpmi8m": {
|
|
"object": "node",
|
|
"id": "zone_x409m2lnw1jpmi8m",
|
|
"type": "zone",
|
|
"name": "kitchen",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-1, 0], [4, 0], [4, 4], [-1, 4]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_and0s1ux5v8rexj6": {
|
|
"object": "node",
|
|
"id": "zone_and0s1ux5v8rexj6",
|
|
"type": "zone",
|
|
"name": "bedroom-2",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-8, -4], [-4, -4], [-4, 0], [-8, 0]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_n8w3oyzr3c4ovcbu": {
|
|
"object": "node",
|
|
"id": "zone_n8w3oyzr3c4ovcbu",
|
|
"type": "zone",
|
|
"name": "hallway",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-4, -2], [-1, -2], [-1, -1], [-4, -1]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_c1wa4cr91h215zzk": {
|
|
"object": "node",
|
|
"id": "zone_c1wa4cr91h215zzk",
|
|
"type": "zone",
|
|
"name": "bathroom-2",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-4, -4], [-1, -4], [-1, -2], [-4, -2]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_e8e6qqmx85tockrm": {
|
|
"object": "node",
|
|
"id": "zone_e8e6qqmx85tockrm",
|
|
"type": "zone",
|
|
"name": "bathroom-1",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-4, -1], [-1, -1], [-1, 0], [-4, 0]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"zone_ebbidjjln9doosy5": {
|
|
"object": "node",
|
|
"id": "zone_ebbidjjln9doosy5",
|
|
"type": "zone",
|
|
"name": "master-bedroom",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[-1, -4], [4, -4], [4, 0], [-1, 0]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"door_v19tfw6dbg60pjka": {
|
|
"object": "node",
|
|
"id": "door_v19tfw6dbg60pjka",
|
|
"type": "door",
|
|
"parentId": "wall_vc5l8mk2b3j3ukvq",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.2, 1.05, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_vc5l8mk2b3j3ukvq",
|
|
"width": 0.9,
|
|
"height": 2.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"door_57wgnpcft27n51ui": {
|
|
"object": "node",
|
|
"id": "door_57wgnpcft27n51ui",
|
|
"type": "door",
|
|
"parentId": "wall_vc5l8mk2b3j3ukvq",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.75, 1.05, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_vc5l8mk2b3j3ukvq",
|
|
"width": 2.2,
|
|
"height": 2.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"door_lv8wmjjs6em9ayqg": {
|
|
"object": "node",
|
|
"id": "door_lv8wmjjs6em9ayqg",
|
|
"type": "door",
|
|
"parentId": "wall_9jaybb53j2r5j5en",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.65, 1.05, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_9jaybb53j2r5j5en",
|
|
"width": 0.9,
|
|
"height": 2.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"door_g1ffn08lohho4vf0": {
|
|
"object": "node",
|
|
"id": "door_g1ffn08lohho4vf0",
|
|
"type": "door",
|
|
"parentId": "wall_53gr0rtp1ssmxvz2",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.3, 1.05, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_53gr0rtp1ssmxvz2",
|
|
"width": 0.8,
|
|
"height": 2.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"door_zuyuxee4afd5ae0o": {
|
|
"object": "node",
|
|
"id": "door_zuyuxee4afd5ae0o",
|
|
"type": "door",
|
|
"parentId": "wall_yzuosc4u4z0a9jqo",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.5, 1.05, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_yzuosc4u4z0a9jqo",
|
|
"width": 0.8,
|
|
"height": 2.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"door_n4kgjkvq18a87rh0": {
|
|
"object": "node",
|
|
"id": "door_n4kgjkvq18a87rh0",
|
|
"type": "door",
|
|
"parentId": "wall_3mznfrklw8ar7jrz",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.5, 1, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_3mznfrklw8ar7jrz",
|
|
"width": 0.7,
|
|
"height": 2,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"threshold": true,
|
|
"thresholdHeight": 0.02,
|
|
"hingesSide": "left",
|
|
"swingDirection": "inward",
|
|
"segments": [
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.4,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
},
|
|
{
|
|
"type": "panel",
|
|
"heightRatio": 0.6,
|
|
"columnRatios": [1],
|
|
"dividerThickness": 0.03,
|
|
"panelDepth": 0.01,
|
|
"panelInset": 0.04
|
|
}
|
|
],
|
|
"handle": true,
|
|
"handleHeight": 1.05,
|
|
"handleSide": "right",
|
|
"contentPadding": [0.04, 0.04],
|
|
"doorCloser": false,
|
|
"panicBar": false,
|
|
"panicBarHeight": 1
|
|
},
|
|
"window_6lkp36vh0kpe8vsl": {
|
|
"object": "node",
|
|
"id": "window_6lkp36vh0kpe8vsl",
|
|
"type": "window",
|
|
"parentId": "wall_vc5l8mk2b3j3ukvq",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.3, 0.7, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_vc5l8mk2b3j3ukvq",
|
|
"width": 2,
|
|
"height": 1.4,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"window_8klttdg0qbxw0v6h": {
|
|
"object": "node",
|
|
"id": "window_8klttdg0qbxw0v6h",
|
|
"type": "window",
|
|
"parentId": "wall_vc5l8mk2b3j3ukvq",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.45, 0.7, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_vc5l8mk2b3j3ukvq",
|
|
"width": 1.4,
|
|
"height": 1.4,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"window_r9mc8jkp0dem9s8u": {
|
|
"object": "node",
|
|
"id": "window_r9mc8jkp0dem9s8u",
|
|
"type": "window",
|
|
"parentId": "wall_a16b1eirqz5p9f98",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.25, 0.55, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_a16b1eirqz5p9f98",
|
|
"width": 1,
|
|
"height": 1.1,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"window_bbmwfj9hjxfz6y7c": {
|
|
"object": "node",
|
|
"id": "window_bbmwfj9hjxfz6y7c",
|
|
"type": "window",
|
|
"parentId": "wall_yiwfcyw716g5ql5y",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.25, 0.7, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_yiwfcyw716g5ql5y",
|
|
"width": 1.4,
|
|
"height": 1.4,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"window_19otr8qt84hke69s": {
|
|
"object": "node",
|
|
"id": "window_19otr8qt84hke69s",
|
|
"type": "window",
|
|
"parentId": "wall_yiwfcyw716g5ql5y",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.75, 0.7, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_yiwfcyw716g5ql5y",
|
|
"width": 1.4,
|
|
"height": 1.4,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"window_qy4pp3lwyn5cq2u1": {
|
|
"object": "node",
|
|
"id": "window_qy4pp3lwyn5cq2u1",
|
|
"type": "window",
|
|
"parentId": "wall_9jaybb53j2r5j5en",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"position": [0.3, 0.3, 0],
|
|
"rotation": [0, 0, 0],
|
|
"wallId": "wall_9jaybb53j2r5j5en",
|
|
"width": 0.8,
|
|
"height": 0.6,
|
|
"frameThickness": 0.05,
|
|
"frameDepth": 0.07,
|
|
"columnRatios": [1],
|
|
"rowRatios": [1],
|
|
"columnDividerThickness": 0.03,
|
|
"rowDividerThickness": 0.03,
|
|
"sill": true,
|
|
"sillDepth": 0.08,
|
|
"sillThickness": 0.03
|
|
},
|
|
"zone_av8rfpjgcpmpx4pb": {
|
|
"object": "node",
|
|
"id": "zone_av8rfpjgcpmpx4pb",
|
|
"type": "zone",
|
|
"name": "pool",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {
|
|
"kind": "pool",
|
|
"depthM": 1.8,
|
|
"finish": "tile"
|
|
},
|
|
"polygon": [[5, -1.5], [10, -1.5], [10, 1.5], [5, 1.5]],
|
|
"color": "#3b82f6"
|
|
},
|
|
"slab_tqyxze2hshzm1it3": {
|
|
"object": "node",
|
|
"id": "slab_tqyxze2hshzm1it3",
|
|
"type": "slab",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"polygon": [[5, -1.5], [10, -1.5], [10, 1.5], [5, 1.5]],
|
|
"holes": [],
|
|
"holeMetadata": [],
|
|
"elevation": -1.8,
|
|
"autoFromWalls": false
|
|
},
|
|
"fence_hnhjl6vicj3fs234": {
|
|
"object": "node",
|
|
"id": "fence_hnhjl6vicj3fs234",
|
|
"type": "fence",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"start": [-10, 7.5],
|
|
"end": [-1, 7.5],
|
|
"height": 1.8,
|
|
"thickness": 0.08,
|
|
"baseHeight": 0.22,
|
|
"postSpacing": 2,
|
|
"postSize": 0.1,
|
|
"topRailHeight": 0.04,
|
|
"groundClearance": 0,
|
|
"edgeInset": 0.015,
|
|
"baseStyle": "grounded",
|
|
"color": "#ffffff",
|
|
"style": "privacy"
|
|
},
|
|
"fence_me6wvw6rf93y2um4": {
|
|
"object": "node",
|
|
"id": "fence_me6wvw6rf93y2um4",
|
|
"type": "fence",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"start": [1, 7.5],
|
|
"end": [10, 7.5],
|
|
"height": 1.8,
|
|
"thickness": 0.08,
|
|
"baseHeight": 0.22,
|
|
"postSpacing": 2,
|
|
"postSize": 0.1,
|
|
"topRailHeight": 0.04,
|
|
"groundClearance": 0,
|
|
"edgeInset": 0.015,
|
|
"baseStyle": "grounded",
|
|
"color": "#ffffff",
|
|
"style": "privacy"
|
|
},
|
|
"fence_af22csiukvc7gjyf": {
|
|
"object": "node",
|
|
"id": "fence_af22csiukvc7gjyf",
|
|
"type": "fence",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"start": [10, 7.5],
|
|
"end": [10, -7.5],
|
|
"height": 1.8,
|
|
"thickness": 0.08,
|
|
"baseHeight": 0.22,
|
|
"postSpacing": 2,
|
|
"postSize": 0.1,
|
|
"topRailHeight": 0.04,
|
|
"groundClearance": 0,
|
|
"edgeInset": 0.015,
|
|
"baseStyle": "grounded",
|
|
"color": "#ffffff",
|
|
"style": "privacy"
|
|
},
|
|
"fence_lp6d7gkrado9z0cc": {
|
|
"object": "node",
|
|
"id": "fence_lp6d7gkrado9z0cc",
|
|
"type": "fence",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"start": [10, -7.5],
|
|
"end": [-10, -7.5],
|
|
"height": 1.8,
|
|
"thickness": 0.08,
|
|
"baseHeight": 0.22,
|
|
"postSpacing": 2,
|
|
"postSize": 0.1,
|
|
"topRailHeight": 0.04,
|
|
"groundClearance": 0,
|
|
"edgeInset": 0.015,
|
|
"baseStyle": "grounded",
|
|
"color": "#ffffff",
|
|
"style": "privacy"
|
|
},
|
|
"fence_a09o9w183o453oqh": {
|
|
"object": "node",
|
|
"id": "fence_a09o9w183o453oqh",
|
|
"type": "fence",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {},
|
|
"start": [-10, -7.5],
|
|
"end": [-10, 7.5],
|
|
"height": 1.8,
|
|
"thickness": 0.08,
|
|
"baseHeight": 0.22,
|
|
"postSpacing": 2,
|
|
"postSize": 0.1,
|
|
"topRailHeight": 0.04,
|
|
"groundClearance": 0,
|
|
"edgeInset": 0.015,
|
|
"baseStyle": "grounded",
|
|
"color": "#ffffff",
|
|
"style": "privacy"
|
|
},
|
|
"zone_gtpdocou2nceicp9": {
|
|
"object": "node",
|
|
"id": "zone_gtpdocou2nceicp9",
|
|
"type": "zone",
|
|
"name": "garden",
|
|
"parentId": "level_9ded0vdlfag09tdt",
|
|
"visible": true,
|
|
"metadata": {
|
|
"kind": "garden"
|
|
},
|
|
"polygon": [[-10, -7.5], [10, -7.5], [10, 7.5], [-10, 7.5]],
|
|
"color": "#3b82f6"
|
|
}
|
|
},
|
|
"rootNodeIds": ["site_3ss5ro12ozrgtdbf"],
|
|
"collections": {}
|
|
}
|