* fix(nodes,viewer): window preset live wall preview + shaped-cutout move tracking MoveWindowTool marked the moving window `isTransient` unconditionally, but WindowSystem only rebuilds the host wall's cutout for non-transient windows — so a window *preset* (isNew) showed no live hole on the wall and couldn't be placed consecutively without leaving/re-entering. Guard the transient mark on `!isNew`, matching MoveDoorTool. Separately, shaped openings (arch / rounded / `opening`) rebuild their cutout brush from `node.position`, which a same-wall move doesn't write (it mutates the mesh directly and publishes to `useLiveTransforms`). The wall-system's `getEffectiveNode` only merges `useLiveNodeOverrides` (resize arrows), so shaped cutouts lagged the move while rectangular ones (rebuilt from the live mesh matrixWorld) tracked. Fold `useLiveTransforms` into door/window children before collecting cutouts so shaped holes follow the live move too. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(editor,viewer,nodes): smooth item placement on shelves Three issues made hosting an item on a shelf janky (item-on-item was already smooth because plain items have no `def.geometry` to rebuild): - Jitter: the draft mesh intercepted the cursor ray, so the shelf-row hit was re-derived from the moving item each frame. Disable raycasting on the draft during placement (incl. async GLB children, reconciled per frame) so the ray passes through to the surface beneath — mirrors MoveRegistryNodeTool. - Reparent/vanish at the edges: `onShelfLeave` flipped state to floor without reparenting the draft off the shelf, so the floor strategy's level-local position rendered compounded with the shelf transform. The grid handler now owns the shelf→floor transition. - In/out oscillation: reparenting the draft onto the shelf dirtied the shelf, and GeometrySystem disposed+rebuilt its boards, making r3f fire a spurious shelf:leave→enter that thrashed placement between the row and the floor. Add an opt-in `def.geometryKey` so GeometrySystem skips the rebuild when geometry inputs are unchanged (shelf boards don't depend on hosted children). Keep the item sticky by testing the cursor ray against the shelf's bounding box: a ray that slips through a gap and lands on the floor behind the shelf still counts as "on the shelf"; only a ray that misses the shelf detaches to the floor. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * feat(editor-app): add Shelf to the standalone editor Build tab The shelf kind is fully wired (def.tool, presentation icon, StructureTool id) but was absent from the standalone editor's Build palette. Add it between Column and Spawn Point. Community has its own build-tab and is left untouched. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * chore(mcp): biome-format coordinate-conventions-demo.json The committed example violated Biome formatting (expanded polygon arrays), which broke the `mcp-ci` Biome check on main (#356) and every branch since. Format it so CI is green. Pure formatting — no content change. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
969 lines
28 KiB
JSON
969 lines
28 KiB
JSON
{
|
|
"nodes": {
|
|
"slab_demo_a": {
|
|
"id": "slab_demo_a",
|
|
"name": "DEMO A -- 6x4 m axis-aligned (baseline)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[18, 0], [24, 0], [24, 4], [18, 4]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_b": {
|
|
"id": "slab_demo_b",
|
|
"name": "DEMO B -- 6x4 m rotated 30 deg from +X (verbatim)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[18, 10], [23.195999999999998, 13], [21.196, 16.464], [16, 13.464]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_origin": {
|
|
"id": "slab_origin",
|
|
"name": "Origin",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-0.3, -0.3], [0.3, -0.3], [0.3, 0.3], [-0.3, 0.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"site_conv_demo": {
|
|
"id": "site_conv_demo",
|
|
"name": "Coords conv demo site",
|
|
"type": "site",
|
|
"object": "node",
|
|
"polygon": {
|
|
"type": "polygon",
|
|
"points": [[-6, -12], [44, -12], [44, 40], [-6, 40]]
|
|
},
|
|
"visible": true,
|
|
"children": ["building_conv_demo"],
|
|
"metadata": {},
|
|
"parentId": null
|
|
},
|
|
"level_conv_demo": {
|
|
"id": "level_conv_demo",
|
|
"name": "Coords conv demo ground level",
|
|
"type": "level",
|
|
"level": 0,
|
|
"object": "node",
|
|
"visible": true,
|
|
"children": [
|
|
"slab_axis_x_bar",
|
|
"slab_axis_x_tip",
|
|
"slab_axis_z_bar",
|
|
"slab_axis_z_tip",
|
|
"slab_axis_neg_x",
|
|
"slab_axis_neg_z",
|
|
"slab_origin",
|
|
"zone_lbl_compass_a",
|
|
"zone_lbl_compass_b",
|
|
"zone_lbl_axis_x",
|
|
"zone_lbl_axis_z",
|
|
"zone_lbl_axis_neg_x",
|
|
"zone_lbl_axis_neg_z",
|
|
"zone_lbl_origin",
|
|
"zone_lbl_caveat_1",
|
|
"zone_lbl_caveat_2",
|
|
"zone_lbl_caveat_3",
|
|
"zone_lbl_caveat_4",
|
|
"slab_demo_a",
|
|
"zone_lbl_a_title",
|
|
"zone_lbl_a_long",
|
|
"zone_lbl_a_short",
|
|
"zone_lbl_a_origin",
|
|
"zone_lbl_a_baseline",
|
|
"slab_demo_b",
|
|
"zone_lbl_b_title_1",
|
|
"zone_lbl_b_title_2",
|
|
"zone_lbl_b_verified_1",
|
|
"zone_lbl_b_verified_2",
|
|
"zone_lbl_b_verified_3",
|
|
"zone_lbl_b_origin",
|
|
"slab_demo_c_page",
|
|
"slab_demo_c_page_ax_x",
|
|
"slab_demo_c_page_ax_y",
|
|
"zone_lbl_c_p_title",
|
|
"zone_lbl_c_p_axx",
|
|
"zone_lbl_c_p_axy",
|
|
"zone_lbl_c_p_stem",
|
|
"zone_lbl_c_p_foot",
|
|
"zone_lbl_c_arrow",
|
|
"slab_demo_c_world",
|
|
"zone_lbl_c_w_title",
|
|
"zone_lbl_c_w_stem",
|
|
"zone_lbl_c_w_foot",
|
|
"zone_lbl_c_w_screen_1",
|
|
"zone_lbl_c_w_screen_2",
|
|
"slab_demo_d_page",
|
|
"slab_demo_d_page_ax_x",
|
|
"slab_demo_d_page_ax_y",
|
|
"zone_lbl_d_p_title_1",
|
|
"zone_lbl_d_p_title_2",
|
|
"zone_lbl_d_p_axx",
|
|
"zone_lbl_d_p_axy",
|
|
"zone_lbl_d_p_hope",
|
|
"zone_lbl_d_arrow",
|
|
"slab_demo_d_world",
|
|
"zone_lbl_d_w_title",
|
|
"zone_lbl_d_w_note_1",
|
|
"zone_lbl_d_w_note_2",
|
|
"zone_lbl_d_w_note_3",
|
|
"zone_lbl_d_w_note_4",
|
|
"zone_lbl_d_w_note_5",
|
|
"zone_takeaway_band",
|
|
"zone_lbl_take_1",
|
|
"zone_lbl_take_2",
|
|
"zone_lbl_take_3",
|
|
"zone_lbl_take_4",
|
|
"zone_lbl_take_5"
|
|
],
|
|
"metadata": {
|
|
"label": "Coords conv demo"
|
|
},
|
|
"parentId": "building_conv_demo"
|
|
},
|
|
"slab_axis_neg_x": {
|
|
"id": "slab_axis_neg_x",
|
|
"name": "-X stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-2.5, -0.06], [0, -0.06], [0, 0.06], [-2.5, 0.06]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_axis_neg_z": {
|
|
"id": "slab_axis_neg_z",
|
|
"name": "-Z stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-0.06, -2.5], [0.06, -2.5], [0.06, 0], [-0.06, 0]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_axis_x_bar": {
|
|
"id": "slab_axis_x_bar",
|
|
"name": "+X axis bar",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[0, -0.06], [12, -0.06], [12, 0.06], [0, 0.06]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_axis_x_tip": {
|
|
"id": "slab_axis_x_tip",
|
|
"name": "+X tip",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[12, -0.4], [12.9, 0], [12, 0.4]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_axis_z_bar": {
|
|
"id": "slab_axis_z_bar",
|
|
"name": "+Z axis bar",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-0.06, 0], [0.06, 0], [0.06, 12], [-0.06, 12]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_axis_z_tip": {
|
|
"id": "slab_axis_z_tip",
|
|
"name": "+Z tip",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-0.4, 12], [0.4, 12], [0, 12.9]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"zone_lbl_a_long": {
|
|
"id": "zone_lbl_a_long",
|
|
"name": "Long edge: 6 m along world +X",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[20.7, 1.3], [21.3, 1.3], [21.3, 1.9000000000000001], [20.7, 1.9000000000000001]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_axis_x": {
|
|
"id": "zone_lbl_axis_x",
|
|
"name": "+X axis = plan first component (12 m long)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[13.299999999999999, -1.3],
|
|
[13.9, -1.3],
|
|
[13.9, -0.7],
|
|
[13.299999999999999, -0.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_axis_z": {
|
|
"id": "zone_lbl_axis_z",
|
|
"name": "+Z axis = plan second component (12 m long)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[-1.3, 13.299999999999999],
|
|
[-0.7, 13.299999999999999],
|
|
[-0.7, 13.9],
|
|
[-1.3, 13.9]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_origin": {
|
|
"id": "zone_lbl_origin",
|
|
"name": "Origin (0, 0) -- all demo coords are world space, metres",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[1.2, 1.2], [1.8, 1.2], [1.8, 1.8], [1.2, 1.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_take_1": {
|
|
"id": "zone_lbl_take_1",
|
|
"name": "TAKEAWAY (1/5): [x,z] -> world (x, 0, z) exactly, no sign flip",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[2.7, 32.7], [3.3, 32.7], [3.3, 33.3], [2.7, 33.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_take_2": {
|
|
"id": "zone_lbl_take_2",
|
|
"name": "(2/5): Demo B verified: 6x4 m, 30 deg, AB perp AD",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[2.7, 33.5], [3.3, 33.5], [3.3, 34.099999999999994], [2.7, 34.099999999999994]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_take_3": {
|
|
"id": "zone_lbl_take_3",
|
|
"name": "(3/5): On-screen orientation is viewport-dependent",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[2.7, 34.300000000000004], [3.3, 34.300000000000004], [3.3, 34.9], [2.7, 34.9]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_take_4": {
|
|
"id": "zone_lbl_take_4",
|
|
"name": "(4/5): 2D plan rotates +90 deg; 3D top-down ~45 deg offset",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[2.7, 35.1], [3.3, 35.1], [3.3, 35.699999999999996], [2.7, 35.699999999999996]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_take_5": {
|
|
"id": "zone_lbl_take_5",
|
|
"name": "(5/5): Verify with a scaled guide image at known anchors",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[21.7, 32.7], [22.3, 32.7], [22.3, 33.3], [21.7, 33.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"slab_demo_c_page": {
|
|
"id": "slab_demo_c_page",
|
|
"name": "DEMO C -- PAGE INTENT (1/2 scale)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[0, 22], [2, 22], [2, 22.5], [0.5, 22.5], [0.5, 24.5], [0, 24.5]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_d_page": {
|
|
"id": "slab_demo_d_page",
|
|
"name": "DEMO D -- PAGE INTENT (z reflected, 1/2 scale)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[22, 24.5], [24, 24.5], [24, 24], [22.5, 24], [22.5, 22], [22, 22]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"zone_lbl_a_short": {
|
|
"id": "zone_lbl_a_short",
|
|
"name": "Short edge: 4 m along world +Z",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[24.5, 1.7], [25.1, 1.7], [25.1, 2.3], [24.5, 2.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_a_title": {
|
|
"id": "zone_lbl_a_title",
|
|
"name": "DEMO A -- axis-aligned 6x4 m rectangle",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[20.7, -1.3], [21.3, -1.3], [21.3, -0.7], [20.7, -0.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_arrow": {
|
|
"id": "zone_lbl_c_arrow",
|
|
"name": "pasted [x,z] UNCORRECTED -->",
|
|
"type": "zone",
|
|
"color": "#ffe9c2",
|
|
"object": "node",
|
|
"polygon": [[6.2, 24.2], [6.8, 24.2], [6.8, 24.8], [6.2, 24.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_p_axx": {
|
|
"id": "zone_lbl_c_p_axx",
|
|
"name": "page +x = author's 'east'",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[2.1, 21.5], [2.6999999999999997, 21.5], [2.6999999999999997, 22.1], [2.1, 22.1]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_p_axy": {
|
|
"id": "zone_lbl_c_p_axy",
|
|
"name": "page +y = author's 'north'",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[-0.7, 24.099999999999998],
|
|
[-0.10000000000000003, 24.099999999999998],
|
|
[-0.10000000000000003, 24.7],
|
|
[-0.7, 24.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_arrow": {
|
|
"id": "zone_lbl_d_arrow",
|
|
"name": "pasted as [x,z] -->",
|
|
"type": "zone",
|
|
"color": "#ffe9c2",
|
|
"object": "node",
|
|
"polygon": [[28.2, 24.2], [28.8, 24.2], [28.8, 24.8], [28.2, 24.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_p_axx": {
|
|
"id": "zone_lbl_d_p_axx",
|
|
"name": "page +x",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[24.099999999999998, 21.5],
|
|
[24.7, 21.5],
|
|
[24.7, 22.1],
|
|
[24.099999999999998, 22.1]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_p_axy": {
|
|
"id": "zone_lbl_d_p_axy",
|
|
"name": "page +y",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[21.3, 24.099999999999998],
|
|
[21.900000000000002, 24.099999999999998],
|
|
[21.900000000000002, 24.7],
|
|
[21.3, 24.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"slab_demo_c_world": {
|
|
"id": "slab_demo_c_world",
|
|
"name": "DEMO C -- WORLD RESULT (uncorrected)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[10, 22], [14, 22], [14, 23], [11, 23], [11, 27], [10, 27]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_d_world": {
|
|
"id": "slab_demo_d_world",
|
|
"name": "DEMO D -- WORLD RESULT (mirror image of Demo C)",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[32, 27], [36, 27], [36, 26], [33, 26], [33, 22], [32, 22]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"zone_lbl_a_origin": {
|
|
"id": "zone_lbl_a_origin",
|
|
"name": "First corner at world (18, 0)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[18.2, 0.2], [18.8, 0.2], [18.8, 0.8], [18.2, 0.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_b_origin": {
|
|
"id": "zone_lbl_b_origin",
|
|
"name": "First vertex (18, 10) -- canonical [[0,0],[5.196,3],...] + offset",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[18.2, 10.2], [18.8, 10.2], [18.8, 10.8], [18.2, 10.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_p_foot": {
|
|
"id": "zone_lbl_c_p_foot",
|
|
"name": "foot: 4 m along page +x",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[1.2, 21.2], [1.8, 21.2], [1.8, 21.8], [1.2, 21.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_p_stem": {
|
|
"id": "zone_lbl_c_p_stem",
|
|
"name": "stem: 5 m along page +y",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[-1.1, 23.099999999999998],
|
|
[-0.5, 23.099999999999998],
|
|
[-0.5, 23.7],
|
|
[-1.1, 23.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_w_foot": {
|
|
"id": "zone_lbl_c_w_foot",
|
|
"name": "foot along world +X (was author's east)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[12.2, 22.2], [12.8, 22.2], [12.8, 22.8], [12.2, 22.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_w_stem": {
|
|
"id": "zone_lbl_c_w_stem",
|
|
"name": "stem along world +Z (was author's north)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[10.2, 24.2], [10.8, 24.2], [10.8, 24.8], [10.2, 24.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_caveat_1": {
|
|
"id": "zone_lbl_caveat_1",
|
|
"name": "Viewports may rotate world axes on screen",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -6.3], [5.3, -6.3], [5.3, -5.7], [4.7, -5.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_caveat_2": {
|
|
"id": "zone_lbl_caveat_2",
|
|
"name": "2D plan panel applies +90 deg rotation",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -7.3], [5.3, -7.3], [5.3, -6.7], [4.7, -6.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_caveat_3": {
|
|
"id": "zone_lbl_caveat_3",
|
|
"name": "3D 'top-down' camera defaults to ~45 deg offset",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -8.3], [5.3, -8.3], [5.3, -7.7], [4.7, -7.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_caveat_4": {
|
|
"id": "zone_lbl_caveat_4",
|
|
"name": "World axes themselves are stable; only display rotates",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -9.3], [5.3, -9.3], [5.3, -8.7], [4.7, -8.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_p_hope": {
|
|
"id": "zone_lbl_d_p_hope",
|
|
"name": "Hope: 'reflecting z will un-mirror the result'",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[22.7, 25.2], [23.3, 25.2], [23.3, 25.8], [22.7, 25.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"building_conv_demo": {
|
|
"id": "building_conv_demo",
|
|
"name": "Demo bld",
|
|
"type": "building",
|
|
"object": "node",
|
|
"visible": true,
|
|
"children": ["level_conv_demo"],
|
|
"metadata": {},
|
|
"parentId": "site_conv_demo",
|
|
"position": [0, 0, 0],
|
|
"rotation": [0, 0, 0]
|
|
},
|
|
"zone_lbl_b_title_1": {
|
|
"id": "zone_lbl_b_title_1",
|
|
"name": "DEMO B -- 6x4 m rectangle",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[21.7, 8.2], [22.3, 8.2], [22.3, 8.8], [21.7, 8.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_b_title_2": {
|
|
"id": "zone_lbl_b_title_2",
|
|
"name": "Rotated 30 deg CCW from world +X",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[21.7, 9], [22.3, 9], [22.3, 9.600000000000001], [21.7, 9.600000000000001]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_p_title": {
|
|
"id": "zone_lbl_c_p_title",
|
|
"name": "DEMO C -- PAGE INTENT (north-up, 1/2 scale)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[0.7, 20.7], [1.3, 20.7], [1.3, 21.3], [0.7, 21.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_w_title": {
|
|
"id": "zone_lbl_c_w_title",
|
|
"name": "DEMO C -- WORLD RESULT (full scale)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[11.7, 20.7], [12.3, 20.7], [12.3, 21.3], [11.7, 21.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_compass_a": {
|
|
"id": "zone_lbl_compass_a",
|
|
"name": "WORLD AXES (authoritative)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -3.8], [5.3, -3.8], [5.3, -3.2], [4.7, -3.2]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_compass_b": {
|
|
"id": "zone_lbl_compass_b",
|
|
"name": "Plan [x,z] maps to world (x, 0, z) -- no sign flip",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[4.7, -4.8], [5.3, -4.8], [5.3, -4.2], [4.7, -4.2]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_title": {
|
|
"id": "zone_lbl_d_w_title",
|
|
"name": "DEMO D -- WORLD RESULT (full scale)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[33.7, 20.7], [34.3, 20.7], [34.3, 21.3], [33.7, 21.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_takeaway_band": {
|
|
"id": "zone_takeaway_band",
|
|
"name": "TAKEAWAY band",
|
|
"type": "zone",
|
|
"color": "#fff5d6",
|
|
"object": "node",
|
|
"polygon": [[0, 32], [40, 32], [40, 36], [0, 36]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_a_baseline": {
|
|
"id": "zone_lbl_a_baseline",
|
|
"name": "Baseline -- matches generate-apartment.md style",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[20.7, 5.2], [21.3, 5.2], [21.3, 5.8], [20.7, 5.8]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_axis_neg_x": {
|
|
"id": "zone_lbl_axis_neg_x",
|
|
"name": "-X (negative first component)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[-2.3, 0.7], [-1.7, 0.7], [-1.7, 1.3], [-2.3, 1.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_axis_neg_z": {
|
|
"id": "zone_lbl_axis_neg_z",
|
|
"name": "-Z (negative second component)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[0.7, -2.3], [1.3, -2.3], [1.3, -1.7], [0.7, -1.7]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_note_1": {
|
|
"id": "zone_lbl_d_w_note_1",
|
|
"name": "Note: z-reflection only helps against a true MIRROR",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[33.7, 27.3],
|
|
[34.3, 27.3],
|
|
[34.3, 27.900000000000002],
|
|
[33.7, 27.900000000000002]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_note_2": {
|
|
"id": "zone_lbl_d_w_note_2",
|
|
"name": "Pascal's view rotates, not mirrors",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[33.7, 28.099999999999998],
|
|
[34.3, 28.099999999999998],
|
|
[34.3, 28.7],
|
|
[33.7, 28.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_note_3": {
|
|
"id": "zone_lbl_d_w_note_3",
|
|
"name": "So this 'fix' doesn't correct on-screen orientation",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[33.7, 28.9], [34.3, 28.9], [34.3, 29.5], [33.7, 29.5]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_note_4": {
|
|
"id": "zone_lbl_d_w_note_4",
|
|
"name": "Real fix: apply whatever rotation matches your viewport",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[33.7, 29.7], [34.3, 29.7], [34.3, 30.3], [33.7, 30.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_w_note_5": {
|
|
"id": "zone_lbl_d_w_note_5",
|
|
"name": "Or verify against a scaled guide image",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[33.7, 30.5], [34.3, 30.5], [34.3, 31.1], [33.7, 31.1]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_p_title_1": {
|
|
"id": "zone_lbl_d_p_title_1",
|
|
"name": "DEMO D -- PAGE INTENT (1/2 scale)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[22.7, 20.7], [23.3, 20.7], [23.3, 21.3], [22.7, 21.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_d_p_title_2": {
|
|
"id": "zone_lbl_d_p_title_2",
|
|
"name": "Author applied z -> 5-z before paste",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[22.7, 19.9], [23.3, 19.9], [23.3, 20.5], [22.7, 20.5]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"slab_demo_c_page_ax_x": {
|
|
"id": "slab_demo_c_page_ax_x",
|
|
"name": "C page +x stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[0.1, 21.95], [1.9, 21.95], [1.9, 22.05], [0.1, 22.05]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_c_page_ax_y": {
|
|
"id": "slab_demo_c_page_ax_y",
|
|
"name": "C page +y stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[-0.05, 22.1], [0.05, 22.1], [0.05, 23.9], [-0.05, 23.9]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_d_page_ax_x": {
|
|
"id": "slab_demo_d_page_ax_x",
|
|
"name": "D page +x stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[22.1, 21.95], [23.9, 21.95], [23.9, 22.05], [22.1, 22.05]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"slab_demo_d_page_ax_y": {
|
|
"id": "slab_demo_d_page_ax_y",
|
|
"name": "D page +y stub",
|
|
"type": "slab",
|
|
"holes": [],
|
|
"object": "node",
|
|
"polygon": [[21.95, 22.1], [22.05, 22.1], [22.05, 23.9], [21.95, 23.9]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo",
|
|
"elevation": 0.01,
|
|
"holeMetadata": [],
|
|
"autoFromWalls": false
|
|
},
|
|
"zone_lbl_b_verified_1": {
|
|
"id": "zone_lbl_b_verified_1",
|
|
"name": "Verified: side lengths 6/4/6/4 m",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[21.7, 16.7], [22.3, 16.7], [22.3, 17.3], [21.7, 17.3]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_b_verified_2": {
|
|
"id": "zone_lbl_b_verified_2",
|
|
"name": "Verified: AB perpendicular to AD (dot=0)",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [[21.7, 17.5], [22.3, 17.5], [22.3, 18.1], [21.7, 18.1]],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_b_verified_3": {
|
|
"id": "zone_lbl_b_verified_3",
|
|
"name": "Verified: first edge heading = 30.0 deg from +X",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[21.7, 18.3],
|
|
[22.3, 18.3],
|
|
[22.3, 18.900000000000002],
|
|
[21.7, 18.900000000000002]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_w_screen_1": {
|
|
"id": "zone_lbl_c_w_screen_1",
|
|
"name": "On-screen orientation depends on viewport",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[11.7, 27.3],
|
|
[12.3, 27.3],
|
|
[12.3, 27.900000000000002],
|
|
[11.7, 27.900000000000002]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
},
|
|
"zone_lbl_c_w_screen_2": {
|
|
"id": "zone_lbl_c_w_screen_2",
|
|
"name": "2D plan: rotated 90 deg; 3D top-down: ~45 deg offset",
|
|
"type": "zone",
|
|
"color": "#f0f0f0",
|
|
"object": "node",
|
|
"polygon": [
|
|
[11.7, 28.099999999999998],
|
|
[12.3, 28.099999999999998],
|
|
[12.3, 28.7],
|
|
[11.7, 28.7]
|
|
],
|
|
"visible": true,
|
|
"metadata": {},
|
|
"parentId": "level_conv_demo"
|
|
}
|
|
},
|
|
"rootNodeIds": ["site_conv_demo"],
|
|
"collections": {}
|
|
}
|