@pascal-app/core 0.9.2 → 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -10
- package/dist/events/bus.d.ts +21 -2
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +17 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +116 -66
- package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-manager.js +316 -441
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
- package/dist/hooks/spatial-grid/spatial-grid-sync.js +193 -12
- package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
- package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/support-host-id.js +2 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
- package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
- package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
- package/dist/index.d.ts +23 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -10
- package/dist/lib/measurement-geometry.d.ts +4 -0
- package/dist/lib/measurement-geometry.d.ts.map +1 -1
- package/dist/lib/measurement-geometry.js +27 -10
- package/dist/lib/slab-polygon.d.ts.map +1 -1
- package/dist/lib/slab-polygon.js +33 -1
- package/dist/lib/space-detection.d.ts +15 -4
- package/dist/lib/space-detection.d.ts.map +1 -1
- package/dist/lib/space-detection.js +174 -88
- package/dist/lib/terrain-brush.d.ts +163 -0
- package/dist/lib/terrain-brush.d.ts.map +1 -0
- package/dist/lib/terrain-brush.js +359 -0
- package/dist/lib/terrain-codec.d.ts +51 -0
- package/dist/lib/terrain-codec.d.ts.map +1 -0
- package/dist/lib/terrain-codec.js +167 -0
- package/dist/lib/terrain-field.d.ts +150 -0
- package/dist/lib/terrain-field.d.ts.map +1 -0
- package/dist/lib/terrain-field.js +248 -0
- package/dist/lib/terrain-raycast.d.ts +44 -0
- package/dist/lib/terrain-raycast.d.ts.map +1 -0
- package/dist/lib/terrain-raycast.js +188 -0
- package/dist/lib/terrain-source.d.ts +60 -0
- package/dist/lib/terrain-source.d.ts.map +1 -0
- package/dist/lib/terrain-source.js +90 -0
- package/dist/lib/terrain-support.d.ts +60 -0
- package/dist/lib/terrain-support.d.ts.map +1 -0
- package/dist/lib/terrain-support.js +150 -0
- package/dist/lib/zone-quantities.d.ts +1 -1
- package/dist/lib/zone-quantities.d.ts.map +1 -1
- package/dist/lib/zone-quantities.js +311 -66
- package/dist/material-library.d.ts +9 -1
- package/dist/material-library.d.ts.map +1 -1
- package/dist/material-library.js +56 -4
- package/dist/registry/handles.d.ts +16 -1
- package/dist/registry/handles.d.ts.map +1 -1
- package/dist/registry/index.d.ts +1 -1
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/subtree.d.ts.map +1 -1
- package/dist/registry/subtree.js +5 -2
- package/dist/registry/types.d.ts +64 -1
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/schema/index.d.ts +6 -3
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +6 -3
- package/dist/schema/nodes/cabinet.d.ts +2 -0
- package/dist/schema/nodes/cabinet.d.ts.map +1 -1
- package/dist/schema/nodes/cabinet.js +4 -2
- package/dist/schema/nodes/ceiling.d.ts +1 -1
- package/dist/schema/nodes/ceiling.d.ts.map +1 -1
- package/dist/schema/nodes/ceiling.js +7 -1
- package/dist/schema/nodes/column.d.ts +1 -0
- package/dist/schema/nodes/column.d.ts.map +1 -1
- package/dist/schema/nodes/column.js +2 -0
- package/dist/schema/nodes/construction-dimension.d.ts +195 -0
- package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
- package/dist/schema/nodes/construction-dimension.js +151 -0
- package/dist/schema/nodes/door.d.ts +29 -0
- package/dist/schema/nodes/door.d.ts.map +1 -1
- package/dist/schema/nodes/door.js +20 -0
- package/dist/schema/nodes/duct-terminal.d.ts +1 -0
- package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
- package/dist/schema/nodes/duct-terminal.js +2 -0
- package/dist/schema/nodes/fence.d.ts +2 -0
- package/dist/schema/nodes/fence.d.ts.map +1 -1
- package/dist/schema/nodes/fence.js +8 -0
- package/dist/schema/nodes/hvac-equipment.d.ts +1 -0
- package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
- package/dist/schema/nodes/hvac-equipment.js +2 -0
- package/dist/schema/nodes/item.d.ts +1 -0
- package/dist/schema/nodes/item.d.ts.map +1 -1
- package/dist/schema/nodes/item.js +13 -0
- package/dist/schema/nodes/level.d.ts +2 -1
- package/dist/schema/nodes/level.d.ts.map +1 -1
- package/dist/schema/nodes/level.js +12 -33
- package/dist/schema/nodes/shelf.d.ts +1 -0
- package/dist/schema/nodes/shelf.d.ts.map +1 -1
- package/dist/schema/nodes/shelf.js +2 -0
- package/dist/schema/nodes/site.d.ts +9 -0
- package/dist/schema/nodes/site.d.ts.map +1 -1
- package/dist/schema/nodes/site.js +8 -6
- package/dist/schema/nodes/slab.d.ts +5 -0
- package/dist/schema/nodes/slab.d.ts.map +1 -1
- package/dist/schema/nodes/slab.js +14 -2
- package/dist/schema/nodes/spawn.d.ts +1 -0
- package/dist/schema/nodes/spawn.d.ts.map +1 -1
- package/dist/schema/nodes/spawn.js +2 -0
- package/dist/schema/nodes/stair.d.ts +3 -1
- package/dist/schema/nodes/stair.d.ts.map +1 -1
- package/dist/schema/nodes/stair.js +8 -1
- package/dist/schema/nodes/structural-grid.d.ts +27 -0
- package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
- package/dist/schema/nodes/structural-grid.js +17 -0
- package/dist/schema/nodes/wall.d.ts +5 -2
- package/dist/schema/nodes/wall.d.ts.map +1 -1
- package/dist/schema/nodes/wall.js +13 -4
- package/dist/schema/nodes/window.d.ts +29 -0
- package/dist/schema/nodes/window.d.ts.map +1 -1
- package/dist/schema/nodes/window.js +18 -0
- package/dist/schema/nodes/zone.d.ts +20 -0
- package/dist/schema/nodes/zone.d.ts.map +1 -1
- package/dist/schema/nodes/zone.js +15 -0
- package/dist/schema/terrain.d.ts +28 -0
- package/dist/schema/terrain.d.ts.map +1 -0
- package/dist/schema/terrain.js +30 -0
- package/dist/schema/types.d.ts +211 -3
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js +4 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
- package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -0
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -1
- package/dist/services/level-height.d.ts +8 -9
- package/dist/services/level-height.d.ts.map +1 -1
- package/dist/services/level-height.js +48 -16
- package/dist/services/storey.d.ts +103 -0
- package/dist/services/storey.d.ts.map +1 -0
- package/dist/services/storey.js +296 -0
- package/dist/store/actions/node-actions.d.ts.map +1 -1
- package/dist/store/actions/node-actions.js +47 -3
- package/dist/store/history-control.d.ts +20 -0
- package/dist/store/history-control.d.ts.map +1 -1
- package/dist/store/history-control.js +110 -13
- package/dist/store/use-live-terrain.d.ts +65 -0
- package/dist/store/use-live-terrain.d.ts.map +1 -0
- package/dist/store/use-live-terrain.js +31 -0
- package/dist/store/use-live-transforms.d.ts +8 -0
- package/dist/store/use-live-transforms.d.ts.map +1 -1
- package/dist/store/use-scene.d.ts +31 -2
- package/dist/store/use-scene.d.ts.map +1 -1
- package/dist/store/use-scene.js +638 -8
- package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
- package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-opening-system.js +27 -21
- package/dist/systems/elevator/elevator-service.d.ts +0 -2
- package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
- package/dist/systems/elevator/elevator-service.js +2 -24
- package/dist/systems/slab/slab-placement.d.ts +11 -0
- package/dist/systems/slab/slab-placement.d.ts.map +1 -0
- package/dist/systems/slab/slab-placement.js +14 -0
- package/dist/systems/slab/slab-support.d.ts +137 -0
- package/dist/systems/slab/slab-support.d.ts.map +1 -0
- package/dist/systems/slab/slab-support.js +557 -0
- package/dist/systems/stair/stair-opening-preview.d.ts +1060 -935
- package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-sync.js +18 -15
- package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
- package/dist/systems/stair/stair-opening-system.js +32 -4
- package/dist/systems/stair/stair-rise.d.ts +22 -0
- package/dist/systems/stair/stair-rise.d.ts.map +1 -0
- package/dist/systems/stair/stair-rise.js +79 -0
- package/dist/systems/wall/wall-curve.d.ts +10 -0
- package/dist/systems/wall/wall-curve.d.ts.map +1 -1
- package/dist/systems/wall/wall-curve.js +1 -1
- package/dist/systems/wall/wall-mitering.js +6 -6
- package/dist/systems/wall/wall-top.d.ts +40 -0
- package/dist/systems/wall/wall-top.d.ts.map +1 -0
- package/dist/systems/wall/wall-top.js +46 -0
- package/dist/utils/clone-scene-graph.d.ts.map +1 -1
- package/dist/utils/clone-scene-graph.js +34 -3
- package/dist/utils/heal-scene-graph.d.ts +1 -1
- package/dist/utils/heal-scene-graph.d.ts.map +1 -1
- package/dist/utils/heal-scene-graph.js +25 -9
- package/dist/validation/validate-build-json.d.ts +2 -0
- package/dist/validation/validate-build-json.d.ts.map +1 -1
- package/dist/validation/validate-build-json.js +59 -3
- package/package.json +2 -2
- package/dist/hooks/scene-registry/scene-registry.test.d.ts +0 -2
- package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +0 -1
- package/dist/hooks/scene-registry/scene-registry.test.js +0 -26
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
- package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -366
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +0 -2
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +0 -1
- package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +0 -363
- package/dist/lib/measurement-geometry.test.d.ts +0 -2
- package/dist/lib/measurement-geometry.test.d.ts.map +0 -1
- package/dist/lib/measurement-geometry.test.js +0 -102
- package/dist/lib/slab-polygon.test.d.ts +0 -2
- package/dist/lib/slab-polygon.test.d.ts.map +0 -1
- package/dist/lib/slab-polygon.test.js +0 -635
- package/dist/lib/space-detection-pause.test.d.ts +0 -2
- package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
- package/dist/lib/space-detection-pause.test.js +0 -42
- package/dist/lib/space-detection.test.d.ts +0 -2
- package/dist/lib/space-detection.test.d.ts.map +0 -1
- package/dist/lib/space-detection.test.js +0 -376
- package/dist/lib/zone-quantities.test.d.ts +0 -2
- package/dist/lib/zone-quantities.test.d.ts.map +0 -1
- package/dist/lib/zone-quantities.test.js +0 -82
- package/dist/registry/registry.test.d.ts +0 -2
- package/dist/registry/registry.test.d.ts.map +0 -1
- package/dist/registry/registry.test.js +0 -196
- package/dist/registry/relations-resolver.test.d.ts +0 -2
- package/dist/registry/relations-resolver.test.d.ts.map +0 -1
- package/dist/registry/relations-resolver.test.js +0 -183
- package/dist/registry/scene-api.test.d.ts +0 -2
- package/dist/registry/scene-api.test.d.ts.map +0 -1
- package/dist/registry/scene-api.test.js +0 -183
- package/dist/registry/subtree.test.d.ts +0 -2
- package/dist/registry/subtree.test.d.ts.map +0 -1
- package/dist/registry/subtree.test.js +0 -163
- package/dist/schema/asset-url.test.d.ts +0 -2
- package/dist/schema/asset-url.test.d.ts.map +0 -1
- package/dist/schema/asset-url.test.js +0 -134
- package/dist/schema/material.test.d.ts +0 -2
- package/dist/schema/material.test.d.ts.map +0 -1
- package/dist/schema/material.test.js +0 -43
- package/dist/schema/nodes/measurement.test.d.ts +0 -2
- package/dist/schema/nodes/measurement.test.d.ts.map +0 -1
- package/dist/schema/nodes/measurement.test.js +0 -139
- package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +0 -2
- package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +0 -1
- package/dist/schema/nodes/ridge-vent-defaults.test.js +0 -205
- package/dist/schema/nodes/roof-segment-shape.test.d.ts +0 -2
- package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +0 -1
- package/dist/schema/nodes/roof-segment-shape.test.js +0 -175
- package/dist/schema/nodes/roof-segment-surface.test.d.ts +0 -2
- package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +0 -1
- package/dist/schema/nodes/roof-segment-surface.test.js +0 -48
- package/dist/schema/nodes/roof-segment-trim.test.d.ts +0 -2
- package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +0 -1
- package/dist/schema/nodes/roof-segment-trim.test.js +0 -107
- package/dist/schema/nodes/roof-segment-walls.test.d.ts +0 -2
- package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +0 -1
- package/dist/schema/nodes/roof-segment-walls.test.js +0 -92
- package/dist/schema/nodes/wall.test.d.ts +0 -2
- package/dist/schema/nodes/wall.test.d.ts.map +0 -1
- package/dist/schema/nodes/wall.test.js +0 -208
- package/dist/services/alignment-anchors.test.d.ts +0 -2
- package/dist/services/alignment-anchors.test.d.ts.map +0 -1
- package/dist/services/alignment-anchors.test.js +0 -383
- package/dist/services/alignment.test.d.ts +0 -2
- package/dist/services/alignment.test.d.ts.map +0 -1
- package/dist/services/alignment.test.js +0 -92
- package/dist/services/drag-session.test.d.ts +0 -2
- package/dist/services/drag-session.test.d.ts.map +0 -1
- package/dist/services/drag-session.test.js +0 -219
- package/dist/services/hosting.test.d.ts +0 -2
- package/dist/services/hosting.test.d.ts.map +0 -1
- package/dist/services/hosting.test.js +0 -230
- package/dist/services/movement.test.d.ts +0 -2
- package/dist/services/movement.test.d.ts.map +0 -1
- package/dist/services/movement.test.js +0 -133
- package/dist/services/opening-guides.test.d.ts +0 -2
- package/dist/services/opening-guides.test.d.ts.map +0 -1
- package/dist/services/opening-guides.test.js +0 -208
- package/dist/services/port-connectivity.test.d.ts +0 -2
- package/dist/services/port-connectivity.test.d.ts.map +0 -1
- package/dist/services/port-connectivity.test.js +0 -297
- package/dist/services/riser-diagram.test.d.ts +0 -2
- package/dist/services/riser-diagram.test.d.ts.map +0 -1
- package/dist/services/riser-diagram.test.js +0 -66
- package/dist/services/single-undo-dance.test.d.ts +0 -2
- package/dist/services/single-undo-dance.test.d.ts.map +0 -1
- package/dist/services/single-undo-dance.test.js +0 -210
- package/dist/services/snap.test.d.ts +0 -2
- package/dist/services/snap.test.d.ts.map +0 -1
- package/dist/services/snap.test.js +0 -137
- package/dist/services/system-graph.test.d.ts +0 -2
- package/dist/services/system-graph.test.d.ts.map +0 -1
- package/dist/services/system-graph.test.js +0 -138
- package/dist/services/validate-dwv.test.d.ts +0 -2
- package/dist/services/validate-dwv.test.d.ts.map +0 -1
- package/dist/services/validate-dwv.test.js +0 -109
- package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
- package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
- package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
- package/dist/store/actions/reparent.test.d.ts +0 -2
- package/dist/store/actions/reparent.test.d.ts.map +0 -1
- package/dist/store/actions/reparent.test.js +0 -212
- package/dist/store/actions/ridge-vent-update.test.d.ts +0 -2
- package/dist/store/actions/ridge-vent-update.test.d.ts.map +0 -1
- package/dist/store/actions/ridge-vent-update.test.js +0 -264
- package/dist/store/use-scene-dirty-tracking.test.d.ts +0 -2
- package/dist/store/use-scene-dirty-tracking.test.d.ts.map +0 -1
- package/dist/store/use-scene-dirty-tracking.test.js +0 -68
- package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
- package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
- package/dist/store/use-scene-elevator-migration.test.js +0 -109
- package/dist/store/use-scene-measurement-roundtrip.test.d.ts +0 -2
- package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +0 -1
- package/dist/store/use-scene-measurement-roundtrip.test.js +0 -97
- package/dist/store/use-scene-plugins.test.d.ts +0 -2
- package/dist/store/use-scene-plugins.test.d.ts.map +0 -1
- package/dist/store/use-scene-plugins.test.js +0 -51
- package/dist/store/use-scene-wall-slot-migration.test.d.ts +0 -2
- package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +0 -1
- package/dist/store/use-scene-wall-slot-migration.test.js +0 -210
- package/dist/store/use-scene-window-migration.test.d.ts +0 -2
- package/dist/store/use-scene-window-migration.test.d.ts.map +0 -1
- package/dist/store/use-scene-window-migration.test.js +0 -85
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
- package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
- package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
- package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
- package/dist/systems/elevator/elevator-runtime.test.js +0 -64
- package/dist/systems/fence/fence-spline.test.d.ts +0 -2
- package/dist/systems/fence/fence-spline.test.d.ts.map +0 -1
- package/dist/systems/fence/fence-spline.test.js +0 -136
- package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
- package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
- package/dist/systems/stair/stair-opening-preview.test.js +0 -80
- package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
- package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
- package/dist/systems/stair/stair-opening-sync.test.js +0 -485
- package/dist/systems/wall/wall-mitering.test.d.ts +0 -2
- package/dist/systems/wall/wall-mitering.test.d.ts.map +0 -1
- package/dist/systems/wall/wall-mitering.test.js +0 -63
- package/dist/utils/clone-scene-graph.test.d.ts +0 -2
- package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
- package/dist/utils/clone-scene-graph.test.js +0 -62
- package/dist/utils/heal-scene-graph.test.d.ts +0 -2
- package/dist/utils/heal-scene-graph.test.d.ts.map +0 -1
- package/dist/utils/heal-scene-graph.test.js +0 -88
|
@@ -1,7 +1,15 @@
|
|
|
1
|
+
import { DEFAULT_LEVEL_HEIGHT, resolveCeilingHeight } from '../services/level-height';
|
|
2
|
+
import { getWallPlaneTop } from '../services/storey';
|
|
3
|
+
import { computeWallSlabSupport } from '../systems/slab/slab-support';
|
|
1
4
|
import { sampleWallCenterline } from '../systems/wall/wall-curve';
|
|
2
|
-
import {
|
|
5
|
+
import { DEFAULT_WALL_THICKNESS } from '../systems/wall/wall-footprint';
|
|
6
|
+
import { resolveWallEffectiveHeight } from '../systems/wall/wall-top';
|
|
3
7
|
import { detectSpacesForLevel } from './space-detection';
|
|
4
8
|
const BOUNDARY_TOLERANCE = 0.08;
|
|
9
|
+
const SURFACE_COVERAGE_THRESHOLD = 0.95;
|
|
10
|
+
const SPACE_CONTAINMENT_THRESHOLD = 0.95;
|
|
11
|
+
const COVERAGE_SAMPLE_STEPS = 24;
|
|
12
|
+
const SURFACE_DATUM_EPSILON = 1e-4;
|
|
5
13
|
function pointDistance(a, b) {
|
|
6
14
|
return Math.hypot(a[0] - b[0], a[1] - b[1]);
|
|
7
15
|
}
|
|
@@ -39,17 +47,6 @@ function signedPolygonArea(polygon) {
|
|
|
39
47
|
function polygonArea(polygon) {
|
|
40
48
|
return Math.abs(signedPolygonArea(polygon));
|
|
41
49
|
}
|
|
42
|
-
function polygonPerimeter(polygon) {
|
|
43
|
-
let perimeter = 0;
|
|
44
|
-
for (let index = 0; index < polygon.length; index += 1) {
|
|
45
|
-
const start = polygon[index];
|
|
46
|
-
const end = polygon[(index + 1) % polygon.length];
|
|
47
|
-
if (!(start && end))
|
|
48
|
-
continue;
|
|
49
|
-
perimeter += pointDistance(start, end);
|
|
50
|
-
}
|
|
51
|
-
return perimeter;
|
|
52
|
-
}
|
|
53
50
|
function polygonsDescribeSameRegion(a, b) {
|
|
54
51
|
if (a.length < 3 || b.length < 3)
|
|
55
52
|
return false;
|
|
@@ -61,8 +58,110 @@ function polygonsDescribeSameRegion(a, b) {
|
|
|
61
58
|
return (a.every((point) => pointToPolygonBoundaryDistance(point, b) <= BOUNDARY_TOLERANCE) &&
|
|
62
59
|
b.every((point) => pointToPolygonBoundaryDistance(point, a) <= BOUNDARY_TOLERANCE));
|
|
63
60
|
}
|
|
64
|
-
function
|
|
65
|
-
|
|
61
|
+
function pointInPolygon(point, polygon, includeBoundary = true) {
|
|
62
|
+
if (polygon.length < 3)
|
|
63
|
+
return false;
|
|
64
|
+
if (pointToPolygonBoundaryDistance(point, polygon) <= 1e-6)
|
|
65
|
+
return includeBoundary;
|
|
66
|
+
let inside = false;
|
|
67
|
+
for (let index = 0, previous = polygon.length - 1; index < polygon.length; previous = index++) {
|
|
68
|
+
const currentPoint = polygon[index];
|
|
69
|
+
const previousPoint = polygon[previous];
|
|
70
|
+
if (currentPoint[1] > point[1] !== previousPoint[1] > point[1] &&
|
|
71
|
+
point[0] <
|
|
72
|
+
((previousPoint[0] - currentPoint[0]) * (point[1] - currentPoint[1])) /
|
|
73
|
+
(previousPoint[1] - currentPoint[1]) +
|
|
74
|
+
currentPoint[0]) {
|
|
75
|
+
inside = !inside;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return inside;
|
|
79
|
+
}
|
|
80
|
+
function segmentsCrossProperly(a, b, c, d) {
|
|
81
|
+
const cross = (start, end, point) => (end[0] - start[0]) * (point[1] - start[1]) - (end[1] - start[1]) * (point[0] - start[0]);
|
|
82
|
+
const abC = cross(a, b, c);
|
|
83
|
+
const abD = cross(a, b, d);
|
|
84
|
+
const cdA = cross(c, d, a);
|
|
85
|
+
const cdB = cross(c, d, b);
|
|
86
|
+
return abC * abD < -1e-12 && cdA * cdB < -1e-12;
|
|
87
|
+
}
|
|
88
|
+
function polygonContainsRegion(outer, inner) {
|
|
89
|
+
if (outer.length < 3 || inner.length < 3)
|
|
90
|
+
return false;
|
|
91
|
+
if (polygonsDescribeSameRegion(outer, inner))
|
|
92
|
+
return true;
|
|
93
|
+
if (!inner.every((point) => pointInPolygon(point, outer) ||
|
|
94
|
+
pointToPolygonBoundaryDistance(point, outer) <= BOUNDARY_TOLERANCE)) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
for (let innerIndex = 0; innerIndex < inner.length; innerIndex += 1) {
|
|
98
|
+
const innerStart = inner[innerIndex];
|
|
99
|
+
const innerEnd = inner[(innerIndex + 1) % inner.length];
|
|
100
|
+
for (let outerIndex = 0; outerIndex < outer.length; outerIndex += 1) {
|
|
101
|
+
if (segmentsCrossProperly(innerStart, innerEnd, outer[outerIndex], outer[(outerIndex + 1) % outer.length])) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return inner.some((start, index) => {
|
|
107
|
+
const end = inner[(index + 1) % inner.length];
|
|
108
|
+
const midpoint = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2];
|
|
109
|
+
return pointInPolygon(start, outer, false) || pointInPolygon(midpoint, outer, false);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function polygonsHaveInteriorOverlap(a, b) {
|
|
113
|
+
if (polygonsDescribeSameRegion(a, b))
|
|
114
|
+
return true;
|
|
115
|
+
if (a.some((point, index) => {
|
|
116
|
+
const end = a[(index + 1) % a.length];
|
|
117
|
+
return (pointInPolygon(point, b, false) ||
|
|
118
|
+
pointInPolygon([(point[0] + end[0]) / 2, (point[1] + end[1]) / 2], b, false));
|
|
119
|
+
})) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
if (b.some((point, index) => {
|
|
123
|
+
const end = b[(index + 1) % b.length];
|
|
124
|
+
return (pointInPolygon(point, a, false) ||
|
|
125
|
+
pointInPolygon([(point[0] + end[0]) / 2, (point[1] + end[1]) / 2], a, false));
|
|
126
|
+
})) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
for (let aIndex = 0; aIndex < a.length; aIndex += 1) {
|
|
130
|
+
for (let bIndex = 0; bIndex < b.length; bIndex += 1) {
|
|
131
|
+
if (segmentsCrossProperly(a[aIndex], a[(aIndex + 1) % a.length], b[bIndex], b[(bIndex + 1) % b.length])) {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
function polygonCoverageRatio(subject, covers) {
|
|
139
|
+
if (subject.length < 3 || covers.length === 0)
|
|
140
|
+
return 0;
|
|
141
|
+
const xs = subject.map((point) => point[0]);
|
|
142
|
+
const ys = subject.map((point) => point[1]);
|
|
143
|
+
const minX = Math.min(...xs);
|
|
144
|
+
const maxX = Math.max(...xs);
|
|
145
|
+
const minY = Math.min(...ys);
|
|
146
|
+
const maxY = Math.max(...ys);
|
|
147
|
+
if (maxX - minX <= 1e-9 || maxY - minY <= 1e-9)
|
|
148
|
+
return 0;
|
|
149
|
+
let inside = 0;
|
|
150
|
+
let covered = 0;
|
|
151
|
+
for (let xIndex = 0; xIndex < COVERAGE_SAMPLE_STEPS; xIndex += 1) {
|
|
152
|
+
for (let yIndex = 0; yIndex < COVERAGE_SAMPLE_STEPS; yIndex += 1) {
|
|
153
|
+
const point = [
|
|
154
|
+
minX + ((xIndex + 0.5) / COVERAGE_SAMPLE_STEPS) * (maxX - minX),
|
|
155
|
+
minY + ((yIndex + 0.5) / COVERAGE_SAMPLE_STEPS) * (maxY - minY),
|
|
156
|
+
];
|
|
157
|
+
if (!pointInPolygon(point, subject))
|
|
158
|
+
continue;
|
|
159
|
+
inside += 1;
|
|
160
|
+
if (covers.some((cover) => pointInPolygon(point, cover)))
|
|
161
|
+
covered += 1;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return inside > 0 ? covered / inside : 0;
|
|
66
165
|
}
|
|
67
166
|
function pointToPolylineDistance(point, polyline) {
|
|
68
167
|
let best = Number.POSITIVE_INFINITY;
|
|
@@ -75,12 +174,11 @@ function pointToPolylineDistance(point, polyline) {
|
|
|
75
174
|
}
|
|
76
175
|
return best;
|
|
77
176
|
}
|
|
78
|
-
function wallForBoundarySegment(start, end,
|
|
177
|
+
function wallForBoundarySegment(start, end, wallPaths) {
|
|
79
178
|
const midpoint = [(start[0] + end[0]) / 2, (start[1] + end[1]) / 2];
|
|
80
179
|
let best = null;
|
|
81
|
-
for (const wall of
|
|
82
|
-
const
|
|
83
|
-
const distances = [start, midpoint, end].map((point) => pointToPolylineDistance(point, centerline));
|
|
180
|
+
for (const { wall, points } of wallPaths) {
|
|
181
|
+
const distances = [start, midpoint, end].map((point) => pointToPolylineDistance(point, points));
|
|
84
182
|
if (distances.some((distance) => distance > BOUNDARY_TOLERANCE))
|
|
85
183
|
continue;
|
|
86
184
|
const distance = distances.reduce((sum, value) => sum + value, 0);
|
|
@@ -89,8 +187,166 @@ function wallForBoundarySegment(start, end, walls) {
|
|
|
89
187
|
}
|
|
90
188
|
return best?.wall ?? null;
|
|
91
189
|
}
|
|
92
|
-
function
|
|
93
|
-
return
|
|
190
|
+
function wallPathsFor(walls) {
|
|
191
|
+
return walls.map((wall) => ({
|
|
192
|
+
wall,
|
|
193
|
+
points: sampleWallCenterline(wall, 32).map((point) => [point.x, point.y]),
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
function pointAlongSegment(start, end, t) {
|
|
197
|
+
return [start[0] + (end[0] - start[0]) * t, start[1] + (end[1] - start[1]) * t];
|
|
198
|
+
}
|
|
199
|
+
function segmentParameter(point, start, end) {
|
|
200
|
+
const dx = end[0] - start[0];
|
|
201
|
+
const dy = end[1] - start[1];
|
|
202
|
+
const lengthSquared = dx * dx + dy * dy;
|
|
203
|
+
return lengthSquared <= 1e-12
|
|
204
|
+
? 0
|
|
205
|
+
: ((point[0] - start[0]) * dx + (point[1] - start[1]) * dy) / lengthSquared;
|
|
206
|
+
}
|
|
207
|
+
function segmentLengthInsideOrNearPolygon(start, end, polygon, tolerance) {
|
|
208
|
+
const dx = end[0] - start[0];
|
|
209
|
+
const dy = end[1] - start[1];
|
|
210
|
+
const length = Math.hypot(dx, dy);
|
|
211
|
+
if (length <= 1e-9)
|
|
212
|
+
return 0;
|
|
213
|
+
const breaks = [0, 1];
|
|
214
|
+
for (let index = 0; index < polygon.length; index += 1) {
|
|
215
|
+
const polygonStart = polygon[index];
|
|
216
|
+
const polygonEnd = polygon[(index + 1) % polygon.length];
|
|
217
|
+
const edgeX = polygonEnd[0] - polygonStart[0];
|
|
218
|
+
const edgeY = polygonEnd[1] - polygonStart[1];
|
|
219
|
+
const denominator = dx * edgeY - dy * edgeX;
|
|
220
|
+
if (Math.abs(denominator) > 1e-12) {
|
|
221
|
+
const t = ((polygonStart[0] - start[0]) * edgeY - (polygonStart[1] - start[1]) * edgeX) / denominator;
|
|
222
|
+
const edgeT = ((polygonStart[0] - start[0]) * dy - (polygonStart[1] - start[1]) * dx) / denominator;
|
|
223
|
+
if (t > 0 && t < 1 && edgeT >= -1e-9 && edgeT <= 1 + 1e-9)
|
|
224
|
+
breaks.push(t);
|
|
225
|
+
}
|
|
226
|
+
if (pointToSegmentDistance(polygonStart, start, end) <= tolerance) {
|
|
227
|
+
const projected = segmentParameter(polygonStart, start, end);
|
|
228
|
+
if (projected > 0 && projected < 1)
|
|
229
|
+
breaks.push(projected);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
breaks.sort((a, b) => a - b);
|
|
233
|
+
const uniqueBreaks = breaks.filter((value, index) => index === 0 || value - breaks[index - 1] > 1e-7);
|
|
234
|
+
let insideLength = 0;
|
|
235
|
+
for (let index = 0; index < uniqueBreaks.length - 1; index += 1) {
|
|
236
|
+
const t0 = uniqueBreaks[index];
|
|
237
|
+
const t1 = uniqueBreaks[index + 1];
|
|
238
|
+
const midpoint = pointAlongSegment(start, end, (t0 + t1) / 2);
|
|
239
|
+
if (pointInPolygon(midpoint, polygon) ||
|
|
240
|
+
pointToPolygonBoundaryDistance(midpoint, polygon) <= tolerance) {
|
|
241
|
+
insideLength += length * (t1 - t0);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return insideLength;
|
|
245
|
+
}
|
|
246
|
+
function boundaryFaceKey(boundary) {
|
|
247
|
+
const pointKey = (point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`;
|
|
248
|
+
const forward = boundary.points.map(pointKey).join('|');
|
|
249
|
+
const reverse = [...boundary.points].reverse().map(pointKey).join('|');
|
|
250
|
+
return `${boundary.wallId}:${boundary.face}:${forward < reverse ? forward : reverse}`;
|
|
251
|
+
}
|
|
252
|
+
function spansFromSpaces(spaces, zone, wallsById) {
|
|
253
|
+
const spans = [];
|
|
254
|
+
const seen = new Set();
|
|
255
|
+
for (const space of spaces) {
|
|
256
|
+
for (const boundary of space.boundaryFaces) {
|
|
257
|
+
const key = boundaryFaceKey(boundary);
|
|
258
|
+
if (seen.has(key))
|
|
259
|
+
continue;
|
|
260
|
+
seen.add(key);
|
|
261
|
+
const wall = wallsById.get(boundary.wallId);
|
|
262
|
+
if (!wall)
|
|
263
|
+
return null;
|
|
264
|
+
const tolerance = (wall.thickness ?? DEFAULT_WALL_THICKNESS) / 2 + BOUNDARY_TOLERANCE;
|
|
265
|
+
let length = 0;
|
|
266
|
+
for (let index = 0; index < boundary.points.length - 1; index += 1) {
|
|
267
|
+
length += segmentLengthInsideOrNearPolygon(boundary.points[index], boundary.points[index + 1], zone.polygon, tolerance);
|
|
268
|
+
}
|
|
269
|
+
if (length > 1e-6)
|
|
270
|
+
spans.push({ wall, length });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return spans.length > 0 ? spans : null;
|
|
274
|
+
}
|
|
275
|
+
function spansFromZoneBoundary(zone, wallPaths) {
|
|
276
|
+
const spans = [];
|
|
277
|
+
for (let edgeIndex = 0; edgeIndex < zone.polygon.length; edgeIndex += 1) {
|
|
278
|
+
const start = zone.polygon[edgeIndex];
|
|
279
|
+
const end = zone.polygon[(edgeIndex + 1) % zone.polygon.length];
|
|
280
|
+
const edgeLength = pointDistance(start, end);
|
|
281
|
+
if (edgeLength <= 1e-6)
|
|
282
|
+
continue;
|
|
283
|
+
const breaks = [0, 1];
|
|
284
|
+
for (const path of wallPaths) {
|
|
285
|
+
for (const point of path.points) {
|
|
286
|
+
if (pointToSegmentDistance(point, start, end) > BOUNDARY_TOLERANCE)
|
|
287
|
+
continue;
|
|
288
|
+
const t = segmentParameter(point, start, end);
|
|
289
|
+
if (t > 0 && t < 1)
|
|
290
|
+
breaks.push(t);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
breaks.sort((a, b) => a - b);
|
|
294
|
+
const uniqueBreaks = breaks.filter((value, index) => index === 0 || value - breaks[index - 1] > 1e-6);
|
|
295
|
+
for (let index = 0; index < uniqueBreaks.length - 1; index += 1) {
|
|
296
|
+
const t0 = uniqueBreaks[index];
|
|
297
|
+
const t1 = uniqueBreaks[index + 1];
|
|
298
|
+
if (t1 - t0 <= 1e-6)
|
|
299
|
+
continue;
|
|
300
|
+
const spanStart = pointAlongSegment(start, end, t0);
|
|
301
|
+
const spanEnd = pointAlongSegment(start, end, t1);
|
|
302
|
+
const wall = wallForBoundarySegment(spanStart, spanEnd, wallPaths);
|
|
303
|
+
if (!wall)
|
|
304
|
+
return null;
|
|
305
|
+
spans.push({ wall, length: edgeLength * (t1 - t0) });
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return spans.length > 0 ? spans : null;
|
|
309
|
+
}
|
|
310
|
+
function proveSurfaceCoverage(zone, nodes, getDatum, labels) {
|
|
311
|
+
const candidates = nodes.filter((node) => polygonsHaveInteriorOverlap(zone.polygon, node.polygon) &&
|
|
312
|
+
polygonCoverageRatio(zone.polygon, [node.polygon]) > 0);
|
|
313
|
+
if (candidates.length === 0 ||
|
|
314
|
+
polygonCoverageRatio(zone.polygon, candidates.map((node) => node.polygon)) < SURFACE_COVERAGE_THRESHOLD) {
|
|
315
|
+
return { status: 'unavailable', reason: `No ${labels.singular} coverage proves this zone.` };
|
|
316
|
+
}
|
|
317
|
+
const datum = getDatum(candidates[0]);
|
|
318
|
+
if (!Number.isFinite(datum) ||
|
|
319
|
+
candidates.some((node) => Math.abs(getDatum(node) - datum) > SURFACE_DATUM_EPSILON)) {
|
|
320
|
+
return {
|
|
321
|
+
status: 'unavailable',
|
|
322
|
+
reason: `${labels.plural} covering this zone have different ${labels.datum}.`,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
let area = polygonArea(zone.polygon);
|
|
326
|
+
const seenHoles = new Set();
|
|
327
|
+
for (const node of candidates) {
|
|
328
|
+
for (const hole of node.holes) {
|
|
329
|
+
const forward = hole.map((point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`).join('|');
|
|
330
|
+
const reverse = [...hole]
|
|
331
|
+
.reverse()
|
|
332
|
+
.map((point) => `${point[0].toFixed(6)},${point[1].toFixed(6)}`)
|
|
333
|
+
.join('|');
|
|
334
|
+
const key = forward < reverse ? forward : reverse;
|
|
335
|
+
if (seenHoles.has(key))
|
|
336
|
+
continue;
|
|
337
|
+
seenHoles.add(key);
|
|
338
|
+
if (polygonContainsRegion(hole, zone.polygon)) {
|
|
339
|
+
return { status: 'unavailable', reason: 'A surface opening removes this zone.' };
|
|
340
|
+
}
|
|
341
|
+
if (polygonContainsRegion(zone.polygon, hole)) {
|
|
342
|
+
area -= polygonArea(hole);
|
|
343
|
+
}
|
|
344
|
+
else if (polygonsHaveInteriorOverlap(zone.polygon, hole)) {
|
|
345
|
+
return { status: 'unavailable', reason: 'A surface opening crosses the zone boundary.' };
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return { status: 'available', area: Math.max(0, area), datum };
|
|
94
350
|
}
|
|
95
351
|
function unavailable(reason) {
|
|
96
352
|
return { status: 'unavailable', reason };
|
|
@@ -101,77 +357,66 @@ export function deriveZoneQuantityReport(zone, sceneNodes) {
|
|
|
101
357
|
? Object.values(sceneNodes).filter((node) => node.parentId === levelId)
|
|
102
358
|
: [];
|
|
103
359
|
const walls = levelNodes.filter((node) => node.type === 'wall');
|
|
104
|
-
const slabs =
|
|
105
|
-
const
|
|
360
|
+
const slabs = levelNodes.filter((node) => node.type === 'slab');
|
|
361
|
+
const wallEffectiveHeight = (wall) => {
|
|
362
|
+
const support = computeWallSlabSupport(wall, slabs, walls, wall.supportSlabId);
|
|
363
|
+
const planeTop = levelId ? getWallPlaneTop(wall, levelId, sceneNodes) : DEFAULT_LEVEL_HEIGHT;
|
|
364
|
+
return resolveWallEffectiveHeight(wall, planeTop, support.elevation);
|
|
365
|
+
};
|
|
106
366
|
const edgeLengths = zone.polygon.map((start, index) => {
|
|
107
367
|
const end = zone.polygon[(index + 1) % zone.polygon.length];
|
|
108
368
|
return end ? pointDistance(start, end) : 0;
|
|
109
369
|
});
|
|
110
370
|
const footprintArea = polygonArea(zone.polygon);
|
|
111
371
|
const perimeter = edgeLengths.reduce((sum, length) => sum + length, 0);
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const allWallsProven = !!wallMatches && wallMatches.length > 0 && wallMatches.every(Boolean);
|
|
127
|
-
const boundaryWallIds = allWallsProven
|
|
128
|
-
? [...new Set(wallMatches.map((match) => match.wall.id))]
|
|
129
|
-
: [];
|
|
372
|
+
const slabCoverage = proveSurfaceCoverage(zone, levelNodes.filter((node) => node.type === 'slab'), (node) => node.elevation, { singular: 'slab', plural: 'Slabs', datum: 'elevations' });
|
|
373
|
+
const ceilingCoverage = proveSurfaceCoverage(zone, levelNodes.filter((node) => node.type === 'ceiling'), (node) => resolveCeilingHeight(node, sceneNodes), { singular: 'ceiling', plural: 'Ceilings', datum: 'heights' });
|
|
374
|
+
const spaces = levelId ? detectSpacesForLevel(levelId, walls).spaces : [];
|
|
375
|
+
const overlappingSpaces = spaces.filter((space) => polygonsHaveInteriorOverlap(zone.polygon, space.polygon));
|
|
376
|
+
const topologyEnclosesZone = overlappingSpaces.length > 0 &&
|
|
377
|
+
polygonCoverageRatio(zone.polygon, overlappingSpaces.map((space) => space.polygon)) >= SPACE_CONTAINMENT_THRESHOLD &&
|
|
378
|
+
overlappingSpaces.every((space) => polygonCoverageRatio(space.polygon, [zone.polygon]) >= SPACE_CONTAINMENT_THRESHOLD);
|
|
379
|
+
const wallsById = new Map(walls.map((wall) => [wall.id, wall]));
|
|
380
|
+
const wallPaths = wallPathsFor(walls);
|
|
381
|
+
const topologyWallSpans = spansFromSpaces(overlappingSpaces, zone, wallsById);
|
|
382
|
+
const boundaryWallSpans = spansFromZoneBoundary(zone, wallPaths);
|
|
383
|
+
const wallSpans = topologyWallSpans ?? boundaryWallSpans;
|
|
384
|
+
const allWallsProven = Boolean(wallSpans);
|
|
385
|
+
const boundaryWallIds = wallSpans ? [...new Set(wallSpans.map((span) => span.wall.id))] : [];
|
|
130
386
|
const wallSurface = allWallsProven
|
|
131
387
|
? {
|
|
132
388
|
status: 'available',
|
|
133
|
-
value:
|
|
134
|
-
note: 'Gross
|
|
389
|
+
value: wallSpans.reduce((sum, span) => sum + span.length * wallEffectiveHeight(span.wall), 0),
|
|
390
|
+
note: 'Gross indoor-facing wall surface within this zone, including both sides of interior partitions.',
|
|
135
391
|
}
|
|
136
|
-
: unavailable(
|
|
137
|
-
|
|
138
|
-
: 'No matching closed wall loop was detected.');
|
|
139
|
-
const matchingSlab = slabs.length === 1 ? slabs[0] : undefined;
|
|
140
|
-
const floorSurface = matchingSlab
|
|
392
|
+
: unavailable('No indoor-facing wall surface is proven within this zone.');
|
|
393
|
+
const floorSurface = slabCoverage.status === 'available'
|
|
141
394
|
? {
|
|
142
395
|
status: 'available',
|
|
143
|
-
value:
|
|
144
|
-
note: '
|
|
396
|
+
value: slabCoverage.area,
|
|
397
|
+
note: 'Zone floor surface proven by compatible slab coverage, after openings.',
|
|
145
398
|
}
|
|
146
|
-
: unavailable(
|
|
147
|
-
? 'More than one slab matches this boundary.'
|
|
148
|
-
: 'No slab matches this zone boundary.');
|
|
149
|
-
const matchingCeiling = ceilings.length === 1 ? ceilings[0] : undefined;
|
|
399
|
+
: unavailable(slabCoverage.reason);
|
|
150
400
|
let volume;
|
|
151
|
-
if (
|
|
152
|
-
volume = unavailable(
|
|
153
|
-
}
|
|
154
|
-
else if (!matchingSlab) {
|
|
155
|
-
volume = unavailable(floorSurface.status === 'unavailable' ? floorSurface.reason : 'No floor.');
|
|
401
|
+
if (slabCoverage.status === 'unavailable') {
|
|
402
|
+
volume = unavailable(slabCoverage.reason);
|
|
156
403
|
}
|
|
157
|
-
else if (
|
|
158
|
-
volume = unavailable(
|
|
159
|
-
? 'More than one ceiling matches this boundary.'
|
|
160
|
-
: 'No ceiling matches this zone boundary.');
|
|
404
|
+
else if (ceilingCoverage.status === 'unavailable') {
|
|
405
|
+
volume = unavailable(ceilingCoverage.reason);
|
|
161
406
|
}
|
|
162
407
|
else {
|
|
163
|
-
const clearHeight =
|
|
408
|
+
const clearHeight = ceilingCoverage.datum - slabCoverage.datum;
|
|
164
409
|
volume =
|
|
165
410
|
Number.isFinite(clearHeight) && clearHeight > 0
|
|
166
411
|
? {
|
|
167
412
|
status: 'available',
|
|
168
|
-
value:
|
|
169
|
-
note: '
|
|
413
|
+
value: slabCoverage.area * clearHeight,
|
|
414
|
+
note: 'Proven zone floor area multiplied by clear ceiling height.',
|
|
170
415
|
}
|
|
171
416
|
: unavailable('The matching ceiling is not above the slab surface.');
|
|
172
417
|
}
|
|
173
418
|
return {
|
|
174
|
-
classification:
|
|
419
|
+
classification: topologyEnclosesZone || boundaryWallSpans ? 'enclosed-room' : 'footprint',
|
|
175
420
|
footprintArea,
|
|
176
421
|
perimeter,
|
|
177
422
|
edgeLengths,
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type MaterialPresetPayload } from './schema/material';
|
|
2
|
+
export type MaterialSource = 'pascal' | 'community' | 'mine' | 'workspace';
|
|
2
3
|
export type MaterialCatalogItem = {
|
|
3
4
|
id: string;
|
|
4
5
|
label: string;
|
|
5
6
|
category: MaterialCategory;
|
|
7
|
+
/** Origin of the entry. Absent = 'pascal' (all static catalog entries). */
|
|
8
|
+
source?: MaterialSource;
|
|
6
9
|
/**
|
|
7
10
|
* Where this finish is appropriate. Absent = universal (e.g. flat colors).
|
|
8
11
|
* The paint picker may filter by the slot being painted; v1 shows everything.
|
|
@@ -13,11 +16,16 @@ export type MaterialCatalogItem = {
|
|
|
13
16
|
previewColor?: string;
|
|
14
17
|
preset: MaterialPresetPayload;
|
|
15
18
|
};
|
|
16
|
-
export declare const MATERIAL_CATEGORIES: readonly ["colors", "wood", "stone", "brick", "tile", "concrete", "metal", "fabric", "leather", "roofing", "ground", "glass"];
|
|
19
|
+
export declare const MATERIAL_CATEGORIES: readonly ["colors", "wood", "stone", "brick", "tile", "wallpaper", "concrete", "metal", "plastic", "fabric", "carpet", "leather", "roofing", "ground", "glass", "other"];
|
|
17
20
|
export type MaterialCategory = (typeof MATERIAL_CATEGORIES)[number];
|
|
18
21
|
export declare const MATERIAL_SURFACES: readonly ["floor", "wall", "ceiling", "roof", "furniture", "outdoor"];
|
|
19
22
|
export type MaterialSurface = (typeof MATERIAL_SURFACES)[number];
|
|
20
23
|
export declare const MATERIAL_CATALOG: MaterialCatalogItem[];
|
|
24
|
+
export declare function registerLibraryMaterials(items: MaterialCatalogItem[]): void;
|
|
25
|
+
export declare function unregisterLibraryMaterials(ids: string[]): void;
|
|
26
|
+
export declare function getDynamicLibraryMaterials(): MaterialCatalogItem[];
|
|
27
|
+
export declare function subscribeLibraryMaterials(listener: () => void): () => void;
|
|
28
|
+
export declare function getLibraryMaterialsVersion(): number;
|
|
21
29
|
export declare function getMaterialsForCategory(category: MaterialCategory): MaterialCatalogItem[];
|
|
22
30
|
export declare function getCatalogMaterialById(id?: string): MaterialCatalogItem | undefined;
|
|
23
31
|
export declare const LIBRARY_MATERIAL_REF_PREFIX = "library:";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-library.d.ts","sourceRoot":"","sources":["../src/material-library.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAuCD,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"material-library.d.ts","sourceRoot":"","sources":["../src/material-library.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,CAAA;AAE1E,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,qBAAqB,CAAA;CAC9B,CAAA;AAuCD,eAAO,MAAM,mBAAmB,0KAiBtB,CAAA;AACV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,eAAO,MAAM,iBAAiB,uEAOpB,CAAA;AACV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhE,eAAO,MAAM,gBAAgB,EAAE,mBAAmB,EAi+HjD,CAAA;AAkBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAM3E;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAM9D;AAED,wBAAgB,0BAA0B,IAAI,mBAAmB,EAAE,CAElE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAK1E;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,EAAE,CAMzF;AAED,wBAAgB,sBAAsB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAGnF;AAED,eAAO,MAAM,2BAA2B,aAAa,CAAA;AACrD,eAAO,MAAM,yBAAyB,WAAW,CAAA;AAEjD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,UAE9C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,UAE5C;AAED,wBAAgB,2BAA2B,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,iBAItE;AAED,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAIpF;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/F,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAM9E;AAED,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAIhG"}
|
package/dist/material-library.js
CHANGED
|
@@ -35,13 +35,17 @@ export const MATERIAL_CATEGORIES = [
|
|
|
35
35
|
'stone',
|
|
36
36
|
'brick',
|
|
37
37
|
'tile',
|
|
38
|
+
'wallpaper',
|
|
38
39
|
'concrete',
|
|
39
40
|
'metal',
|
|
41
|
+
'plastic',
|
|
40
42
|
'fabric',
|
|
43
|
+
'carpet',
|
|
41
44
|
'leather',
|
|
42
45
|
'roofing',
|
|
43
46
|
'ground',
|
|
44
47
|
'glass',
|
|
48
|
+
'other',
|
|
45
49
|
];
|
|
46
50
|
export const MATERIAL_SURFACES = [
|
|
47
51
|
'floor',
|
|
@@ -4091,13 +4095,59 @@ export const MATERIAL_CATALOG = [
|
|
|
4091
4095
|
},
|
|
4092
4096
|
},
|
|
4093
4097
|
];
|
|
4098
|
+
const STATIC_CATALOG_IDS = new Set(MATERIAL_CATALOG.map((item) => item.id));
|
|
4099
|
+
// Embedder-registered library materials (user/community/workspace). Core stays
|
|
4100
|
+
// passive: hosts push entries in; nothing here fetches. Static catalog entries
|
|
4101
|
+
// win on id collision so a registration can never shadow a built-in.
|
|
4102
|
+
const dynamicLibraryMaterials = new Map();
|
|
4103
|
+
const dynamicLibraryListeners = new Set();
|
|
4104
|
+
let dynamicLibraryVersion = 0;
|
|
4105
|
+
function notifyDynamicLibraryChange() {
|
|
4106
|
+
dynamicLibraryVersion += 1;
|
|
4107
|
+
for (const listener of [...dynamicLibraryListeners]) {
|
|
4108
|
+
listener();
|
|
4109
|
+
}
|
|
4110
|
+
}
|
|
4111
|
+
export function registerLibraryMaterials(items) {
|
|
4112
|
+
if (items.length === 0)
|
|
4113
|
+
return;
|
|
4114
|
+
for (const item of items) {
|
|
4115
|
+
dynamicLibraryMaterials.set(item.id, item);
|
|
4116
|
+
}
|
|
4117
|
+
notifyDynamicLibraryChange();
|
|
4118
|
+
}
|
|
4119
|
+
export function unregisterLibraryMaterials(ids) {
|
|
4120
|
+
let changed = false;
|
|
4121
|
+
for (const id of ids) {
|
|
4122
|
+
changed = dynamicLibraryMaterials.delete(id) || changed;
|
|
4123
|
+
}
|
|
4124
|
+
if (changed)
|
|
4125
|
+
notifyDynamicLibraryChange();
|
|
4126
|
+
}
|
|
4127
|
+
export function getDynamicLibraryMaterials() {
|
|
4128
|
+
return [...dynamicLibraryMaterials.values()];
|
|
4129
|
+
}
|
|
4130
|
+
export function subscribeLibraryMaterials(listener) {
|
|
4131
|
+
dynamicLibraryListeners.add(listener);
|
|
4132
|
+
return () => {
|
|
4133
|
+
dynamicLibraryListeners.delete(listener);
|
|
4134
|
+
};
|
|
4135
|
+
}
|
|
4136
|
+
export function getLibraryMaterialsVersion() {
|
|
4137
|
+
return dynamicLibraryVersion;
|
|
4138
|
+
}
|
|
4094
4139
|
export function getMaterialsForCategory(category) {
|
|
4095
|
-
|
|
4140
|
+
const items = MATERIAL_CATALOG.filter((item) => item.category === category);
|
|
4141
|
+
for (const item of dynamicLibraryMaterials.values()) {
|
|
4142
|
+
if (item.category === category && !STATIC_CATALOG_IDS.has(item.id))
|
|
4143
|
+
items.push(item);
|
|
4144
|
+
}
|
|
4145
|
+
return items;
|
|
4096
4146
|
}
|
|
4097
4147
|
export function getCatalogMaterialById(id) {
|
|
4098
4148
|
if (!id)
|
|
4099
4149
|
return undefined;
|
|
4100
|
-
return MATERIAL_CATALOG.find((item) => item.id === id);
|
|
4150
|
+
return MATERIAL_CATALOG.find((item) => item.id === id) ?? dynamicLibraryMaterials.get(id);
|
|
4101
4151
|
}
|
|
4102
4152
|
export const LIBRARY_MATERIAL_REF_PREFIX = 'library:';
|
|
4103
4153
|
export const SCENE_MATERIAL_REF_PREFIX = 'scene:';
|
|
@@ -4108,14 +4158,16 @@ export function toSceneMaterialRef(id) {
|
|
|
4108
4158
|
return `${SCENE_MATERIAL_REF_PREFIX}${id}`;
|
|
4109
4159
|
}
|
|
4110
4160
|
export function getLibraryMaterialIdFromRef(materialRef) {
|
|
4111
|
-
if (
|
|
4161
|
+
if (typeof materialRef !== 'string')
|
|
4112
4162
|
return null;
|
|
4113
4163
|
if (!materialRef.startsWith(LIBRARY_MATERIAL_REF_PREFIX))
|
|
4114
4164
|
return null;
|
|
4115
4165
|
return materialRef.slice(LIBRARY_MATERIAL_REF_PREFIX.length);
|
|
4116
4166
|
}
|
|
4117
4167
|
export function getSceneMaterialIdFromRef(materialRef) {
|
|
4118
|
-
if (
|
|
4168
|
+
if (typeof materialRef !== 'string')
|
|
4169
|
+
return null;
|
|
4170
|
+
if (!materialRef.startsWith(SCENE_MATERIAL_REF_PREFIX))
|
|
4119
4171
|
return null;
|
|
4120
4172
|
return materialRef.slice(SCENE_MATERIAL_REF_PREFIX.length);
|
|
4121
4173
|
}
|
|
@@ -97,6 +97,13 @@ export type LinearResizeHandle<N> = {
|
|
|
97
97
|
anchor: HandleAnchor;
|
|
98
98
|
currentValue: (node: N) => number;
|
|
99
99
|
apply: (node: N, newValue: number, sceneApi: SceneApi) => Partial<N>;
|
|
100
|
+
/**
|
|
101
|
+
* Additional live-only patches for geometry owned by related nodes. The
|
|
102
|
+
* editor publishes these during the drag and clears them on release or
|
|
103
|
+
* cancellation; committed scene writes remain the responsibility of
|
|
104
|
+
* `commit` (or the generic selected-node update).
|
|
105
|
+
*/
|
|
106
|
+
previewOverrides?: (node: N, newValue: number, sceneApi: SceneApi) => ReadonlyArray<readonly [AnyNodeId, Partial<AnyNode>]>;
|
|
100
107
|
/** Optional live-scene visibility gate for context-dependent arrows. */
|
|
101
108
|
visible?: (node: N, sceneApi: SceneApi) => boolean;
|
|
102
109
|
/**
|
|
@@ -115,6 +122,12 @@ export type LinearResizeHandle<N> = {
|
|
|
115
122
|
* by `apply`.
|
|
116
123
|
*/
|
|
117
124
|
onDrag?: (node: N, sceneApi: SceneApi) => void;
|
|
125
|
+
/**
|
|
126
|
+
* Cleanup companion to {@link onDrag}. Called for commit, cancellation, and
|
|
127
|
+
* unmount so a descriptor can release transient feedback it owns without the
|
|
128
|
+
* generic renderer knowing which guide store produced it.
|
|
129
|
+
*/
|
|
130
|
+
onDragEnd?: (node: N, sceneApi: SceneApi) => void;
|
|
118
131
|
/**
|
|
119
132
|
* Cross-node redirect. By default the drag's live override + the
|
|
120
133
|
* committed write both land on the SELECTED node. When this returns
|
|
@@ -131,6 +144,8 @@ export type LinearResizeHandle<N> = {
|
|
|
131
144
|
max?: number | ((node: N, sceneApi: SceneApi) => number);
|
|
132
145
|
/** Snap the resized scalar to the editor's active grid step before apply. */
|
|
133
146
|
gridSnap?: boolean;
|
|
147
|
+
/** Kind-owned magnetic snap for the resized scalar, gated by the active snapping mode. */
|
|
148
|
+
magneticSnap?: (node: N, newValue: number, sceneApi: SceneApi) => number;
|
|
134
149
|
placement: HandlePlacement<N>;
|
|
135
150
|
/**
|
|
136
151
|
* Dimension this handle steers (e.g. `'height'`). When set, the editor
|
|
@@ -390,5 +405,5 @@ export type HandleDescriptor<N = any> = LinearResizeHandle<N> | RadialResizeHand
|
|
|
390
405
|
* Static array, or a function for shape-dependent cases (column
|
|
391
406
|
* crossSection / supportStyle, stair-segment segmentType, etc.).
|
|
392
407
|
*/
|
|
393
|
-
export type HandleList<N> = HandleDescriptor<N>[] | ((node: N) => HandleDescriptor<N>[]);
|
|
408
|
+
export type HandleList<N> = HandleDescriptor<N>[] | ((node: N, sceneApi?: SceneApi) => HandleDescriptor<N>[]);
|
|
394
409
|
//# sourceMappingURL=handles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/registry/handles.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/registry/handles.ts"],"names":[],"mappings":"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"}
|