@ifc-lite/create 4.0.0 → 5.1.0
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 +34 -0
- package/dist/in-store/align-boxes.d.ts +38 -0
- package/dist/in-store/align-boxes.d.ts.map +1 -0
- package/dist/in-store/align-boxes.js +97 -0
- package/dist/in-store/align-boxes.js.map +1 -0
- package/dist/in-store/anchor.d.ts.map +1 -1
- package/dist/in-store/anchor.js +13 -2
- package/dist/in-store/anchor.js.map +1 -1
- package/dist/in-store/beam.d.ts.map +1 -1
- package/dist/in-store/beam.js +3 -10
- package/dist/in-store/beam.js.map +1 -1
- package/dist/in-store/copy-array.d.ts +17 -0
- package/dist/in-store/copy-array.d.ts.map +1 -0
- package/dist/in-store/copy-array.js +47 -0
- package/dist/in-store/copy-array.js.map +1 -0
- package/dist/in-store/copy-batch.d.ts +27 -0
- package/dist/in-store/copy-batch.d.ts.map +1 -0
- package/dist/in-store/copy-batch.js +101 -0
- package/dist/in-store/copy-batch.js.map +1 -0
- package/dist/in-store/copy-dependent-walk.d.ts +27 -0
- package/dist/in-store/copy-dependent-walk.d.ts.map +1 -0
- package/dist/in-store/copy-dependent-walk.js +61 -0
- package/dist/in-store/copy-dependent-walk.js.map +1 -0
- package/dist/in-store/copy-frame.d.ts +4 -3
- package/dist/in-store/copy-frame.d.ts.map +1 -1
- package/dist/in-store/copy-frame.js +14 -1
- package/dist/in-store/copy-frame.js.map +1 -1
- package/dist/in-store/copy-product.d.ts +0 -20
- package/dist/in-store/copy-product.d.ts.map +1 -1
- package/dist/in-store/copy-product.js +35 -35
- package/dist/in-store/copy-product.js.map +1 -1
- package/dist/in-store/edit/effective-mutation-view.d.ts +6 -0
- package/dist/in-store/edit/effective-mutation-view.d.ts.map +1 -0
- package/dist/in-store/edit/effective-mutation-view.js +45 -0
- package/dist/in-store/edit/effective-mutation-view.js.map +1 -0
- package/dist/in-store/edit/effective-storey.d.ts +13 -0
- package/dist/in-store/edit/effective-storey.d.ts.map +1 -0
- package/dist/in-store/edit/effective-storey.js +36 -0
- package/dist/in-store/edit/effective-storey.js.map +1 -0
- package/dist/in-store/edit/effective-storeys.d.ts +9 -0
- package/dist/in-store/edit/effective-storeys.d.ts.map +1 -0
- package/dist/in-store/edit/effective-storeys.js +16 -0
- package/dist/in-store/edit/effective-storeys.js.map +1 -0
- package/dist/in-store/edit/hosted-opening-refit.d.ts +29 -0
- package/dist/in-store/edit/hosted-opening-refit.d.ts.map +1 -0
- package/dist/in-store/edit/hosted-opening-refit.js +168 -0
- package/dist/in-store/edit/hosted-opening-refit.js.map +1 -0
- package/dist/in-store/edit/length-unit-scale.d.ts +24 -0
- package/dist/in-store/edit/length-unit-scale.d.ts.map +1 -0
- package/dist/in-store/edit/length-unit-scale.js +37 -0
- package/dist/in-store/edit/length-unit-scale.js.map +1 -0
- package/dist/in-store/edit/linear-element-edit.d.ts +131 -0
- package/dist/in-store/edit/linear-element-edit.d.ts.map +1 -0
- package/dist/in-store/edit/linear-element-edit.js +259 -0
- package/dist/in-store/edit/linear-element-edit.js.map +1 -0
- package/dist/in-store/edit/metadata-clone-effective.d.ts +5 -0
- package/dist/in-store/edit/metadata-clone-effective.d.ts.map +1 -0
- package/dist/in-store/edit/metadata-clone-effective.js +47 -0
- package/dist/in-store/edit/metadata-clone-effective.js.map +1 -0
- package/dist/in-store/edit/metadata-clone.d.ts +40 -0
- package/dist/in-store/edit/metadata-clone.d.ts.map +1 -0
- package/dist/in-store/edit/metadata-clone.js +107 -0
- package/dist/in-store/edit/metadata-clone.js.map +1 -0
- package/dist/in-store/edit/placement-core.d.ts +140 -0
- package/dist/in-store/edit/placement-core.d.ts.map +1 -0
- package/dist/in-store/edit/placement-core.js +317 -0
- package/dist/in-store/edit/placement-core.js.map +1 -0
- package/dist/in-store/edit/polygon-clip.d.ts +58 -0
- package/dist/in-store/edit/polygon-clip.d.ts.map +1 -0
- package/dist/in-store/edit/polygon-clip.js +153 -0
- package/dist/in-store/edit/polygon-clip.js.map +1 -0
- package/dist/in-store/edit/read-profile.d.ts +6 -0
- package/dist/in-store/edit/read-profile.d.ts.map +1 -0
- package/dist/in-store/edit/read-profile.js +95 -0
- package/dist/in-store/edit/read-profile.js.map +1 -0
- package/dist/in-store/edit/slab-edit-frame.d.ts +40 -0
- package/dist/in-store/edit/slab-edit-frame.d.ts.map +1 -0
- package/dist/in-store/edit/slab-edit-frame.js +146 -0
- package/dist/in-store/edit/slab-edit-frame.js.map +1 -0
- package/dist/in-store/edit/slab-edit.d.ts +112 -0
- package/dist/in-store/edit/slab-edit.d.ts.map +1 -0
- package/dist/in-store/edit/slab-edit.js +275 -0
- package/dist/in-store/edit/slab-edit.js.map +1 -0
- package/dist/in-store/edit/slab-opening-carry.d.ts +10 -0
- package/dist/in-store/edit/slab-opening-carry.d.ts.map +1 -0
- package/dist/in-store/edit/slab-opening-carry.js +65 -0
- package/dist/in-store/edit/slab-opening-carry.js.map +1 -0
- package/dist/in-store/edit/split-guid.d.ts +29 -0
- package/dist/in-store/edit/split-guid.d.ts.map +1 -0
- package/dist/in-store/edit/split-guid.js +64 -0
- package/dist/in-store/edit/split-guid.js.map +1 -0
- package/dist/in-store/edit/split-target.d.ts +90 -0
- package/dist/in-store/edit/split-target.d.ts.map +1 -0
- package/dist/in-store/edit/split-target.js +116 -0
- package/dist/in-store/edit/split-target.js.map +1 -0
- package/dist/in-store/edit/target.d.ts +8 -0
- package/dist/in-store/edit/target.d.ts.map +1 -0
- package/dist/in-store/edit/target.js +5 -0
- package/dist/in-store/edit/target.js.map +1 -0
- package/dist/in-store/edit/trim-extend-geometry.d.ts +99 -0
- package/dist/in-store/edit/trim-extend-geometry.d.ts.map +1 -0
- package/dist/in-store/edit/trim-extend-geometry.js +105 -0
- package/dist/in-store/edit/trim-extend-geometry.js.map +1 -0
- package/dist/in-store/edit/wall-axis-edit.d.ts +16 -0
- package/dist/in-store/edit/wall-axis-edit.d.ts.map +1 -0
- package/dist/in-store/edit/wall-axis-edit.js +40 -0
- package/dist/in-store/edit/wall-axis-edit.js.map +1 -0
- package/dist/in-store/edit/wall-edit.d.ts +157 -0
- package/dist/in-store/edit/wall-edit.d.ts.map +1 -0
- package/dist/in-store/edit/wall-edit.js +276 -0
- package/dist/in-store/edit/wall-edit.js.map +1 -0
- package/dist/in-store/edit/wall-hosted-cuts.d.ts +35 -0
- package/dist/in-store/edit/wall-hosted-cuts.d.ts.map +1 -0
- package/dist/in-store/edit/wall-hosted-cuts.js +27 -0
- package/dist/in-store/edit/wall-hosted-cuts.js.map +1 -0
- package/dist/in-store/edit/wall-opening-reassign.d.ts +18 -0
- package/dist/in-store/edit/wall-opening-reassign.d.ts.map +1 -0
- package/dist/in-store/edit/wall-opening-reassign.js +50 -0
- package/dist/in-store/edit/wall-opening-reassign.js.map +1 -0
- package/dist/in-store/element-align.d.ts +13 -0
- package/dist/in-store/element-align.d.ts.map +1 -0
- package/dist/in-store/element-align.js +90 -0
- package/dist/in-store/element-align.js.map +1 -0
- package/dist/in-store/element-replacement.d.ts +26 -0
- package/dist/in-store/element-replacement.d.ts.map +1 -0
- package/dist/in-store/element-replacement.js +68 -0
- package/dist/in-store/element-replacement.js.map +1 -0
- package/dist/in-store/element-size-edit.d.ts +40 -0
- package/dist/in-store/element-size-edit.d.ts.map +1 -0
- package/dist/in-store/element-size-edit.js +103 -0
- package/dist/in-store/element-size-edit.js.map +1 -0
- package/dist/in-store/element-split-axis.d.ts +6 -0
- package/dist/in-store/element-split-axis.d.ts.map +1 -0
- package/dist/in-store/element-split-axis.js +87 -0
- package/dist/in-store/element-split-axis.js.map +1 -0
- package/dist/in-store/element-split-joined.d.ts +13 -0
- package/dist/in-store/element-split-joined.d.ts.map +1 -0
- package/dist/in-store/element-split-joined.js +74 -0
- package/dist/in-store/element-split-joined.js.map +1 -0
- package/dist/in-store/element-split-placement.d.ts +19 -0
- package/dist/in-store/element-split-placement.d.ts.map +1 -0
- package/dist/in-store/element-split-placement.js +48 -0
- package/dist/in-store/element-split-placement.js.map +1 -0
- package/dist/in-store/element-split-slab.d.ts +19 -0
- package/dist/in-store/element-split-slab.d.ts.map +1 -0
- package/dist/in-store/element-split-slab.js +86 -0
- package/dist/in-store/element-split-slab.js.map +1 -0
- package/dist/in-store/element-split.d.ts +49 -0
- package/dist/in-store/element-split.d.ts.map +1 -0
- package/dist/in-store/element-split.js +52 -0
- package/dist/in-store/element-split.js.map +1 -0
- package/dist/in-store/element-transform-edit.d.ts +33 -0
- package/dist/in-store/element-transform-edit.d.ts.map +1 -0
- package/dist/in-store/element-transform-edit.js +97 -0
- package/dist/in-store/element-transform-edit.js.map +1 -0
- package/dist/in-store/element-transform-frames.d.ts +58 -0
- package/dist/in-store/element-transform-frames.d.ts.map +1 -0
- package/dist/in-store/element-transform-frames.js +110 -0
- package/dist/in-store/element-transform-frames.js.map +1 -0
- package/dist/in-store/element-transform-joins.d.ts +4 -0
- package/dist/in-store/element-transform-joins.d.ts.map +1 -0
- package/dist/in-store/element-transform-joins.js +62 -0
- package/dist/in-store/element-transform-joins.js.map +1 -0
- package/dist/in-store/element-transform-plan.d.ts +38 -0
- package/dist/in-store/element-transform-plan.d.ts.map +1 -0
- package/dist/in-store/element-transform-plan.js +115 -0
- package/dist/in-store/element-transform-plan.js.map +1 -0
- package/dist/in-store/element-trim-extend.d.ts +25 -0
- package/dist/in-store/element-trim-extend.d.ts.map +1 -0
- package/dist/in-store/element-trim-extend.js +97 -0
- package/dist/in-store/element-trim-extend.js.map +1 -0
- package/dist/in-store/extract-grids.d.ts +7 -17
- package/dist/in-store/extract-grids.d.ts.map +1 -1
- package/dist/in-store/extract-grids.js +11 -2
- package/dist/in-store/extract-grids.js.map +1 -1
- package/dist/in-store/grid-column.d.ts +23 -0
- package/dist/in-store/grid-column.d.ts.map +1 -0
- package/dist/in-store/grid-column.js +73 -0
- package/dist/in-store/grid-column.js.map +1 -0
- package/dist/in-store/grid-intersection-read.d.ts +10 -0
- package/dist/in-store/grid-intersection-read.d.ts.map +1 -0
- package/dist/in-store/grid-intersection-read.js +45 -0
- package/dist/in-store/grid-intersection-read.js.map +1 -0
- package/dist/in-store/grid.d.ts +7 -1
- package/dist/in-store/grid.d.ts.map +1 -1
- package/dist/in-store/grid.js +12 -2
- package/dist/in-store/grid.js.map +1 -1
- package/dist/in-store/group-evidence.d.ts +49 -0
- package/dist/in-store/group-evidence.d.ts.map +1 -0
- package/dist/in-store/group-evidence.js +111 -0
- package/dist/in-store/group-evidence.js.map +1 -0
- package/dist/in-store/group-graph.d.ts +51 -0
- package/dist/in-store/group-graph.d.ts.map +1 -0
- package/dist/in-store/group-graph.js +213 -0
- package/dist/in-store/group-graph.js.map +1 -0
- package/dist/in-store/group.d.ts +34 -0
- package/dist/in-store/group.d.ts.map +1 -0
- package/dist/in-store/group.js +181 -0
- package/dist/in-store/group.js.map +1 -0
- package/dist/in-store/host-geometry-frame.d.ts +5 -1
- package/dist/in-store/host-geometry-frame.d.ts.map +1 -1
- package/dist/in-store/host-geometry-frame.js +46 -2
- package/dist/in-store/host-geometry-frame.js.map +1 -1
- package/dist/in-store/index.d.ts +7 -0
- package/dist/in-store/index.d.ts.map +1 -1
- package/dist/in-store/index.js +7 -0
- package/dist/in-store/index.js.map +1 -1
- package/dist/in-store/linear-profile-frame.d.ts +10 -0
- package/dist/in-store/linear-profile-frame.d.ts.map +1 -0
- package/dist/in-store/linear-profile-frame.js +17 -0
- package/dist/in-store/linear-profile-frame.js.map +1 -0
- package/dist/in-store/material.d.ts.map +1 -1
- package/dist/in-store/material.js +17 -6
- package/dist/in-store/material.js.map +1 -1
- package/dist/in-store/member.d.ts.map +1 -1
- package/dist/in-store/member.js +3 -7
- package/dist/in-store/member.js.map +1 -1
- package/dist/in-store/ordinary-element.d.ts +47 -0
- package/dist/in-store/ordinary-element.d.ts.map +1 -0
- package/dist/in-store/ordinary-element.js +38 -0
- package/dist/in-store/ordinary-element.js.map +1 -0
- package/dist/in-store/placement-frame.d.ts +6 -1
- package/dist/in-store/placement-frame.d.ts.map +1 -1
- package/dist/in-store/placement-frame.js +5 -1
- package/dist/in-store/placement-frame.js.map +1 -1
- package/dist/in-store/resolve-anchor.d.ts +3 -2
- package/dist/in-store/resolve-anchor.d.ts.map +1 -1
- package/dist/in-store/resolve-anchor.js +7 -5
- package/dist/in-store/resolve-anchor.js.map +1 -1
- package/dist/in-store/resolve-relations.d.ts +3 -1
- package/dist/in-store/resolve-relations.d.ts.map +1 -1
- package/dist/in-store/resolve-relations.js +8 -3
- package/dist/in-store/resolve-relations.js.map +1 -1
- package/dist/in-store/room-candidates.d.ts +58 -0
- package/dist/in-store/room-candidates.d.ts.map +1 -0
- package/dist/in-store/room-candidates.js +135 -0
- package/dist/in-store/room-candidates.js.map +1 -0
- package/dist/in-store/room-creation-plan.d.ts +16 -0
- package/dist/in-store/room-creation-plan.d.ts.map +1 -0
- package/dist/in-store/room-creation-plan.js +28 -0
- package/dist/in-store/room-creation-plan.js.map +1 -0
- package/dist/in-store/room-floor-height.d.ts +24 -0
- package/dist/in-store/room-floor-height.d.ts.map +1 -0
- package/dist/in-store/room-floor-height.js +32 -0
- package/dist/in-store/room-floor-height.js.map +1 -0
- package/dist/in-store/room-footprint-native.d.ts +19 -0
- package/dist/in-store/room-footprint-native.d.ts.map +1 -0
- package/dist/in-store/room-footprint-native.js +117 -0
- package/dist/in-store/room-footprint-native.js.map +1 -0
- package/dist/in-store/room-layout-cache.d.ts +23 -0
- package/dist/in-store/room-layout-cache.d.ts.map +1 -0
- package/dist/in-store/room-layout-cache.js +84 -0
- package/dist/in-store/room-layout-cache.js.map +1 -0
- package/dist/in-store/room-layout-core.d.ts +68 -0
- package/dist/in-store/room-layout-core.d.ts.map +1 -0
- package/dist/in-store/room-layout-core.js +153 -0
- package/dist/in-store/room-layout-core.js.map +1 -0
- package/dist/in-store/room-population.d.ts +5 -0
- package/dist/in-store/room-population.d.ts.map +1 -0
- package/dist/in-store/room-population.js +28 -0
- package/dist/in-store/room-population.js.map +1 -0
- package/dist/in-store/room-space-meshes.d.ts +15 -0
- package/dist/in-store/room-space-meshes.d.ts.map +1 -0
- package/dist/in-store/room-space-meshes.js +38 -0
- package/dist/in-store/room-space-meshes.js.map +1 -0
- package/dist/in-store/room-store.d.ts +55 -0
- package/dist/in-store/room-store.d.ts.map +1 -0
- package/dist/in-store/room-store.js +173 -0
- package/dist/in-store/room-store.js.map +1 -0
- package/dist/in-store/room-storey-elevation.d.ts +5 -0
- package/dist/in-store/room-storey-elevation.d.ts.map +1 -0
- package/dist/in-store/room-storey-elevation.js +42 -0
- package/dist/in-store/room-storey-elevation.js.map +1 -0
- package/dist/in-store/room-storey-frame.d.ts +47 -0
- package/dist/in-store/room-storey-frame.d.ts.map +1 -0
- package/dist/in-store/room-storey-frame.js +48 -0
- package/dist/in-store/room-storey-frame.js.map +1 -0
- package/dist/in-store/room-wall-rects.d.ts +117 -0
- package/dist/in-store/room-wall-rects.d.ts.map +1 -0
- package/dist/in-store/room-wall-rects.js +157 -0
- package/dist/in-store/room-wall-rects.js.map +1 -0
- package/dist/in-store/schema-attributes.d.ts +3 -3
- package/dist/in-store/schema-attributes.d.ts.map +1 -1
- package/dist/in-store/schema-attributes.js +9 -7
- package/dist/in-store/schema-attributes.js.map +1 -1
- package/dist/in-store/slab.d.ts.map +1 -1
- package/dist/in-store/slab.js +1 -4
- package/dist/in-store/slab.js.map +1 -1
- package/dist/in-store/stair-removal.d.ts +17 -0
- package/dist/in-store/stair-removal.d.ts.map +1 -0
- package/dist/in-store/stair-removal.js +134 -0
- package/dist/in-store/stair-removal.js.map +1 -0
- package/dist/in-store/storey-plan-frame.d.ts +2 -1
- package/dist/in-store/storey-plan-frame.d.ts.map +1 -1
- package/dist/in-store/storey-plan-frame.js +20 -11
- package/dist/in-store/storey-plan-frame.js.map +1 -1
- package/dist/in-store/storey-reassignment-plan.d.ts +53 -0
- package/dist/in-store/storey-reassignment-plan.d.ts.map +1 -0
- package/dist/in-store/storey-reassignment-plan.js +237 -0
- package/dist/in-store/storey-reassignment-plan.js.map +1 -0
- package/dist/in-store/storey-reassignment.d.ts +8 -0
- package/dist/in-store/storey-reassignment.d.ts.map +1 -0
- package/dist/in-store/storey-reassignment.js +52 -0
- package/dist/in-store/storey-reassignment.js.map +1 -0
- package/dist/in-store/trim-extend-plan.d.ts +27 -0
- package/dist/in-store/trim-extend-plan.d.ts.map +1 -0
- package/dist/in-store/trim-extend-plan.js +49 -0
- package/dist/in-store/trim-extend-plan.js.map +1 -0
- package/dist/in-store/wall-join-edit.d.ts +0 -17
- package/dist/in-store/wall-join-edit.d.ts.map +1 -1
- package/dist/in-store/wall-join-edit.js +41 -7
- package/dist/in-store/wall-join-edit.js.map +1 -1
- package/dist/in-store/wall-section-edit.d.ts +16 -0
- package/dist/in-store/wall-section-edit.d.ts.map +1 -0
- package/dist/in-store/wall-section-edit.js +75 -0
- package/dist/in-store/wall-section-edit.js.map +1 -0
- package/dist/in-store/wall-size-edit.d.ts +29 -0
- package/dist/in-store/wall-size-edit.d.ts.map +1 -0
- package/dist/in-store/wall-size-edit.js +65 -0
- package/dist/in-store/wall-size-edit.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/package.json +8 -7
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/** Shared native DCEL reads and edit policy for the Room command (#6232 D5).
|
|
5
|
+
* The host supplies the actual WASM plate; this module owns no runtime heap. */
|
|
6
|
+
import { polygonArea } from './room-footprint-offset.js';
|
|
7
|
+
const errorMessage = (error) => error instanceof Error
|
|
8
|
+
? error.message || error.name || 'Edit failed'
|
|
9
|
+
: String(error).replace(/^\w+:\s*/, '');
|
|
10
|
+
function distToSeg(px, py, ax, ay, bx, by) {
|
|
11
|
+
const dx = bx - ax, dy = by - ay;
|
|
12
|
+
const len2 = dx * dx + dy * dy || 1e-9;
|
|
13
|
+
const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / len2));
|
|
14
|
+
return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
|
|
15
|
+
}
|
|
16
|
+
const pts = (flat) => {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (let i = 0; i + 1 < flat.length; i += 2)
|
|
19
|
+
out.push([flat[i], flat[i + 1]]);
|
|
20
|
+
return out;
|
|
21
|
+
};
|
|
22
|
+
/** Every room face of `plate`, with its wall-axis, inner and outer outlines. */
|
|
23
|
+
export function readFaces(plate) {
|
|
24
|
+
return plate.snapshot().map((r) => ({
|
|
25
|
+
face: r.face,
|
|
26
|
+
centre: r.outline,
|
|
27
|
+
inner: pts(plate.netOutline(r.face, true)),
|
|
28
|
+
outer: pts(plate.netOutline(r.face, false)),
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
/** Creation cutoff filters reads without discarding a retained edited plate. */
|
|
32
|
+
export function filterRoomFaces(faces, minArea) {
|
|
33
|
+
return faces.filter((face) => Math.min(polygonArea(face.inner.length >= 3 ? face.inner : face.centre), polygonArea(face.centre)) >= minArea);
|
|
34
|
+
}
|
|
35
|
+
const EPS = 1e-6;
|
|
36
|
+
const same = (p, q) => Math.abs(p[0] - q[0]) < EPS && Math.abs(p[1] - q[1]) < EPS;
|
|
37
|
+
/** The layout edge nearest `p` within `tol`: its half-edge id and the face on this side. */
|
|
38
|
+
function edgeAt(h, p, tol) {
|
|
39
|
+
let best = null;
|
|
40
|
+
for (const r of h.snapshot()) {
|
|
41
|
+
const bounds = h.boundingElements(r.face);
|
|
42
|
+
const n = r.outline.length;
|
|
43
|
+
for (let i = 0; i < n; i++) {
|
|
44
|
+
const a = r.outline[i], b = r.outline[(i + 1) % n];
|
|
45
|
+
const d = distToSeg(p[0], p[1], a[0], a[1], b[0], b[1]);
|
|
46
|
+
if (bounds[i] && d <= tol && (!best || d < best.d))
|
|
47
|
+
best = { edge: bounds[i].edge, face: r.face, a, b, d };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return best;
|
|
51
|
+
}
|
|
52
|
+
/** Project `p` onto segment a→b. */
|
|
53
|
+
function onSegment(p, a, b) {
|
|
54
|
+
const dx = b[0] - a[0], dy = b[1] - a[1];
|
|
55
|
+
const t = Math.max(0, Math.min(1, ((p[0] - a[0]) * dx + (p[1] - a[1]) * dy) / (dx * dx + dy * dy || 1e-12)));
|
|
56
|
+
return [a[0] + t * dx, a[1] + t * dy];
|
|
57
|
+
}
|
|
58
|
+
/** A cut end: an existing node, else a new node on the wall edge there. */
|
|
59
|
+
function cutNode(h, p, tol) {
|
|
60
|
+
const v = h.findVertexNear(p[0], p[1], tol);
|
|
61
|
+
if (v !== undefined) {
|
|
62
|
+
const room = h.snapshot().flatMap((r) => r.outline).find((q) => Math.hypot(q[0] - p[0], q[1] - p[1]) <= tol);
|
|
63
|
+
return { v, at: room ?? [p[0], p[1]] };
|
|
64
|
+
}
|
|
65
|
+
const e = edgeAt(h, p, tol);
|
|
66
|
+
if (!e)
|
|
67
|
+
throw new Error('pick the cut ends on the room outline');
|
|
68
|
+
const at = onSegment(p, e.a, e.b);
|
|
69
|
+
return { v: h.splitEdge(e.edge, at[0], at[1]), at };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Run `op` on `h` (the Edit gestures, as plate calls). Throws the
|
|
73
|
+
* engine's refusal (`editError` reads it). Returns false when nothing changed.
|
|
74
|
+
*/
|
|
75
|
+
export function applyLayoutOp(h, op, tol) {
|
|
76
|
+
switch (op.kind) {
|
|
77
|
+
case 'prune':
|
|
78
|
+
return h.prune() > 0;
|
|
79
|
+
case 'drag': {
|
|
80
|
+
const v = h.findVertexNear(op.from[0], op.from[1], tol);
|
|
81
|
+
if (v === undefined)
|
|
82
|
+
throw new Error('no room corner here');
|
|
83
|
+
h.dragVertex(v, op.to[0], op.to[1]);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
case 'split': {
|
|
87
|
+
// Insert any new node on a wall edge, then cut the room both ends bound.
|
|
88
|
+
const a = cutNode(h, op.a, tol);
|
|
89
|
+
const b = cutNode(h, op.b, tol);
|
|
90
|
+
if (a.v === b.v)
|
|
91
|
+
throw new Error('the two cut points are the same');
|
|
92
|
+
const onBoundary = (r, p) => r.outline.some((q) => same(q, p));
|
|
93
|
+
const room = h.snapshot().find((r) => onBoundary(r, a.at) && onBoundary(r, b.at));
|
|
94
|
+
if (!room)
|
|
95
|
+
throw new Error('the two points are not on the same room');
|
|
96
|
+
h.splitFace(room.face, a.v, b.v, -1);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
case 'remove': {
|
|
100
|
+
const v = h.findVertexNear(op.at[0], op.at[1], tol);
|
|
101
|
+
if (v !== undefined) {
|
|
102
|
+
// A corner between two walls dissolves; a wall junction won't, so remove one of its walls.
|
|
103
|
+
try {
|
|
104
|
+
h.dissolveVertex(v);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch (dissolveError) {
|
|
108
|
+
const reason = errorMessage(dissolveError);
|
|
109
|
+
for (const r of h.snapshot()) {
|
|
110
|
+
const k = r.outline.findIndex((q) => Math.hypot(q[0] - op.at[0], q[1] - op.at[1]) <= tol);
|
|
111
|
+
if (k < 0)
|
|
112
|
+
continue;
|
|
113
|
+
const bounds = h.boundingElements(r.face);
|
|
114
|
+
for (const idx of [k, (k - 1 + r.outline.length) % r.outline.length]) {
|
|
115
|
+
const b = bounds[idx];
|
|
116
|
+
if (!b)
|
|
117
|
+
continue;
|
|
118
|
+
try {
|
|
119
|
+
removeEdge(h, b.edge);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.debug('[room.place] enclosing wall retained', errorMessage(error));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`no wall here separates two rooms (${reason})`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const e = edgeAt(h, op.at, tol);
|
|
131
|
+
if (!e)
|
|
132
|
+
throw new Error('no room edge here');
|
|
133
|
+
removeEdge(h, e.edge);
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Merge the two rooms an edge separates, or delete a bridge / spur wall and its orphans. */
|
|
139
|
+
function removeEdge(h, edge) {
|
|
140
|
+
const across = h.neighborAcross(edge);
|
|
141
|
+
const rooms = new Set(h.roomIds());
|
|
142
|
+
const own = h.snapshot().find((r) => h.boundingElements(r.face).some((b) => b.edge === edge))?.face;
|
|
143
|
+
if (across !== undefined && own !== undefined && across !== own && rooms.has(across))
|
|
144
|
+
h.mergeFaces(edge);
|
|
145
|
+
else
|
|
146
|
+
h.removeEdge(edge);
|
|
147
|
+
}
|
|
148
|
+
export function flattenRoomRects(rects) {
|
|
149
|
+
const flat = new Float64Array(rects.length * 8);
|
|
150
|
+
rects.forEach((r, w) => r.slice(0, 4).forEach((p, c) => { flat[w * 8 + c * 2] = p[0]; flat[w * 8 + c * 2 + 1] = p[1]; }));
|
|
151
|
+
return flat;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=room-layout-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-layout-core.js","sourceRoot":"","sources":["../../src/in-store/room-layout-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import { type MutablePropertyView } from '@ifc-lite/mutations';
|
|
3
|
+
/** Complete live IfcSpace ownership, including spaces without readable geometry (#7324). */
|
|
4
|
+
export declare function effectiveRoomIdsByStorey(store: IfcDataStore, view: MutablePropertyView | null | undefined, storeyIds: readonly number[]): Map<number, number[]>;
|
|
5
|
+
//# sourceMappingURL=room-population.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-population.d.ts","sourceRoot":"","sources":["../../src/in-store/room-population.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1F,4FAA4F;AAC5F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAC9F,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAcvB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { iterateEffectiveEntityIds } from '@ifc-lite/mutations';
|
|
5
|
+
import { liveEntityConforms } from './resolve-relations.js';
|
|
6
|
+
import { effectiveStoreyId } from './edit/effective-storey.js';
|
|
7
|
+
/** Complete live IfcSpace ownership, including spaces without readable geometry (#7324). */
|
|
8
|
+
export function effectiveRoomIdsByStorey(store, view, storeyIds) {
|
|
9
|
+
const populations = new Map(storeyIds.map(id => [id, []]));
|
|
10
|
+
let scanned = 0;
|
|
11
|
+
for (const { expressId } of iterateEffectiveEntityIds(store, view)) {
|
|
12
|
+
if (++scanned > 200000)
|
|
13
|
+
throw new Error('The loaded model is too large for a complete reviewed Room population');
|
|
14
|
+
if (!liveEntityConforms(store, expressId, 'IfcSpace', view))
|
|
15
|
+
continue;
|
|
16
|
+
const owner = effectiveStoreyId(store, view, expressId);
|
|
17
|
+
const rows = owner === undefined ? undefined : populations.get(owner);
|
|
18
|
+
if (!rows)
|
|
19
|
+
continue;
|
|
20
|
+
if (rows.length >= 128)
|
|
21
|
+
throw new Error('More than 128 rooms belong to this storey; a complete review is unavailable');
|
|
22
|
+
rows.push(expressId);
|
|
23
|
+
}
|
|
24
|
+
for (const rows of populations.values())
|
|
25
|
+
rows.sort((a, b) => a - b);
|
|
26
|
+
return populations;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=room-population.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-population.js","sourceRoot":"","sources":["../../src/in-store/room-population.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAG/D,OAAO,EAAE,yBAAyB,EAA4B,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CACtC,KAAmB,EAAE,IAA4C,EAAE,SAA4B;IAE/F,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAc,CAAC,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,EAAE,SAAS,EAAE,IAAI,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACnE,IAAI,EAAE,OAAO,GAAG,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACjH,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC;YAAE,SAAS;QACtE,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAC;QACvH,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Mesh-to-plan adapter; candidate occupancy policy is shared in create. */
|
|
2
|
+
import type { MeshData } from '@ifc-lite/geometry';
|
|
3
|
+
import type { Pt } from './room-layout-core.js';
|
|
4
|
+
type Tri = [Pt, Pt, Pt];
|
|
5
|
+
/**
|
|
6
|
+
* The plan triangles of the IfcSpace meshes whose height range overlaps the
|
|
7
|
+
* render-Y band `[lo, hi]`. `toPlan` maps a render-frame vertex to the plan
|
|
8
|
+
* frame the rooms are in; `live` drops meshes of deleted spaces.
|
|
9
|
+
*/
|
|
10
|
+
export declare function spaceMeshTriangles(meshes: readonly MeshData[], band: {
|
|
11
|
+
lo: number;
|
|
12
|
+
hi: number;
|
|
13
|
+
}, toPlan: (x: number, y: number, z: number) => Pt, live: (mesh: MeshData) => boolean): Tri[];
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=room-space-meshes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-space-meshes.d.ts","sourceRoot":"","sources":["../../src/in-store/room-space-meshes.ts"],"names":[],"mappings":"AAIA,4EAA4E;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAChD,KAAK,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAIxB;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAChC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,EAAE,EAC/C,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,GAChC,GAAG,EAAE,CAsBP"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
const cross = (o, a, b) => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
|
|
5
|
+
/**
|
|
6
|
+
* The plan triangles of the IfcSpace meshes whose height range overlaps the
|
|
7
|
+
* render-Y band `[lo, hi]`. `toPlan` maps a render-frame vertex to the plan
|
|
8
|
+
* frame the rooms are in; `live` drops meshes of deleted spaces.
|
|
9
|
+
*/
|
|
10
|
+
export function spaceMeshTriangles(meshes, band, toPlan, live) {
|
|
11
|
+
const out = [];
|
|
12
|
+
for (const mesh of meshes) {
|
|
13
|
+
if (mesh.ifcType !== 'IfcSpace' || !live(mesh))
|
|
14
|
+
continue;
|
|
15
|
+
const pos = mesh.positions;
|
|
16
|
+
const o = mesh.origin ?? [0, 0, 0];
|
|
17
|
+
let ymin = Infinity, ymax = -Infinity;
|
|
18
|
+
for (let i = 1; i < pos.length; i += 3) {
|
|
19
|
+
const y = o[1] + pos[i];
|
|
20
|
+
if (y < ymin)
|
|
21
|
+
ymin = y;
|
|
22
|
+
if (y > ymax)
|
|
23
|
+
ymax = y;
|
|
24
|
+
}
|
|
25
|
+
if (!(ymax > band.lo && ymin < band.hi))
|
|
26
|
+
continue;
|
|
27
|
+
const at = (v) => toPlan(o[0] + pos[v * 3], o[1] + pos[v * 3 + 1], o[2] + pos[v * 3 + 2]);
|
|
28
|
+
const idx = mesh.indices;
|
|
29
|
+
for (let t = 0; t + 2 < idx.length; t += 3) {
|
|
30
|
+
const tri = [at(idx[t]), at(idx[t + 1]), at(idx[t + 2])];
|
|
31
|
+
// Walls of the volume project to slivers; only its floor and ceiling cover plan area.
|
|
32
|
+
if (Math.abs(cross(tri[0], tri[1], tri[2])) > 1e-9)
|
|
33
|
+
out.push(tri);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=room-space-meshes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-space-meshes.js","sourceRoot":"","sources":["../../src/in-store/room-space-meshes.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAO/D,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,CAAK,EAAE,CAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA2B,EAC3B,IAAgC,EAChC,MAA+C,EAC/C,IAAiC;IAEjC,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,QAAQ,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtG,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,sFAAsF;YACtF,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
2
|
+
import { type StoreEditor } from '@ifc-lite/mutations';
|
|
3
|
+
import { type SlabSplitChain } from './edit/split-target.js';
|
|
4
|
+
import { type GlobalIdScope } from './edit/split-guid.js';
|
|
5
|
+
import { type RoomBoundary, type RoomCandidate } from './room-candidates.js';
|
|
6
|
+
import type { LayoutFace, Pt } from './room-layout-core.js';
|
|
7
|
+
export interface NewRoom {
|
|
8
|
+
outline: Pt[];
|
|
9
|
+
height: number;
|
|
10
|
+
z: number;
|
|
11
|
+
Name: string;
|
|
12
|
+
PredefinedType?: string;
|
|
13
|
+
ObjectType?: string;
|
|
14
|
+
grossArea: number;
|
|
15
|
+
netArea: number;
|
|
16
|
+
derived: boolean;
|
|
17
|
+
}
|
|
18
|
+
export type RoomChain = SlabSplitChain;
|
|
19
|
+
export type RoomRewrite = {
|
|
20
|
+
ok: true;
|
|
21
|
+
storeyId: number;
|
|
22
|
+
chain: RoomChain;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
reason: 'shape' | 'storey';
|
|
26
|
+
};
|
|
27
|
+
export type RoomUpdate = {
|
|
28
|
+
ok: true;
|
|
29
|
+
outline: Pt[];
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
reason: 'shape' | 'storey' | 'noRoom';
|
|
33
|
+
};
|
|
34
|
+
export interface LayoutSync {
|
|
35
|
+
created: number[];
|
|
36
|
+
deleted: number[];
|
|
37
|
+
remesh: number[];
|
|
38
|
+
}
|
|
39
|
+
/** Source and overlay use the exact same supported extrusion predicate. */
|
|
40
|
+
export declare function roomChainInStore(store: IfcDataStore, editor: StoreEditor, id: number): RoomRewrite;
|
|
41
|
+
/** Auto/pick/draw commit their supplied native outlines together as one operation. */
|
|
42
|
+
export declare function createRoomsInStore(store: IfcDataStore, editor: StoreEditor, storeyId: number, rooms: readonly NewRoom[]): number[];
|
|
43
|
+
export declare function setRoomAreasInStore(editor: StoreEditor, id: number, areas: {
|
|
44
|
+
grossArea: number;
|
|
45
|
+
netArea: number;
|
|
46
|
+
}, height: number): void;
|
|
47
|
+
/** Preserve root identity, placement, metadata and links while replacing only its profile. */
|
|
48
|
+
export declare function rewriteRoomOutlineInStore(store: IfcDataStore, editor: StoreEditor, id: number, chain: RoomChain, outline: readonly Pt[], areas: {
|
|
49
|
+
grossArea: number;
|
|
50
|
+
netArea: number;
|
|
51
|
+
}): void;
|
|
52
|
+
export declare function updateRoomOutlineInStore(store: IfcDataStore, editor: StoreEditor, id: number, boundary: RoomBoundary, roomsOn: (storeyId: number) => readonly RoomCandidate[]): RoomUpdate;
|
|
53
|
+
/** Native layout edit keeps the larger split/merged room identity and its metadata. */
|
|
54
|
+
export declare function syncRoomLayoutInStore(store: IfcDataStore, editor: StoreEditor, before: readonly RoomCandidate[], after: readonly LayoutFace[], globalIdScopes?: readonly GlobalIdScope[], editedStoreyId?: number): LayoutSync;
|
|
55
|
+
//# sourceMappingURL=room-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-store.d.ts","sourceRoot":"","sources":["../../src/in-store/room-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/** Canonical atomic Room graph writes over the native DCEL's candidates (#6232 D5). */
|
|
5
|
+
import { editOwnershipRefusal } from '@ifc-lite/export';
|
|
6
|
+
import { QuantityType } from '@ifc-lite/data';
|
|
7
|
+
import { getSchemaRegistryForVersion } from '@ifc-lite/parser';
|
|
8
|
+
import { recordSessionMutation } from '@ifc-lite/mutations';
|
|
9
|
+
import { addSpaceToStore } from './space.js';
|
|
10
|
+
import { GENERATED_SPACE_OBJECTTYPE } from './generate-spaces.js';
|
|
11
|
+
import { resolveSpatialAnchor } from './resolve-anchor.js';
|
|
12
|
+
import { resolveSplitTarget } from './edit/split-target.js';
|
|
13
|
+
import { getModelLengthUnitScale } from './edit/length-unit-scale.js';
|
|
14
|
+
import { effectiveStoreyId } from './edit/effective-storey.js';
|
|
15
|
+
import { emitClippedProfile } from './element-split-slab.js';
|
|
16
|
+
import { readAttributes } from './edit/placement-core.js';
|
|
17
|
+
import { cloneElementMetadata } from './edit/metadata-clone.js';
|
|
18
|
+
import { deriveSplitGlobalId, globalIdTakenIn, keepsFirstPiece } from './edit/split-guid.js';
|
|
19
|
+
import { polygonArea as polyArea, pointInPolygon as pointInPoly } from './room-footprint-offset.js';
|
|
20
|
+
import { roomAt, interiorPoint, roomOutline } from './room-candidates.js';
|
|
21
|
+
/** Source and overlay use the exact same supported extrusion predicate. */
|
|
22
|
+
export function roomChainInStore(store, editor, id) {
|
|
23
|
+
const view = editor.getMutationView();
|
|
24
|
+
const target = resolveSplitTarget(store, view, editor, id, getModelLengthUnitScale(store));
|
|
25
|
+
if (!target.ok)
|
|
26
|
+
return { ok: false, reason: target.code === 'storey' || target.code === 'container' ? 'storey' : 'shape' };
|
|
27
|
+
if (target.kind !== 'slab' || target.chain.elementType !== 'IfcSpace')
|
|
28
|
+
return { ok: false, reason: 'shape' };
|
|
29
|
+
const storeyId = effectiveStoreyId(store, view, id);
|
|
30
|
+
return storeyId === undefined ? { ok: false, reason: 'storey' } : { ok: true, storeyId, chain: target.chain };
|
|
31
|
+
}
|
|
32
|
+
/** Auto/pick/draw commit their supplied native outlines together as one operation. */
|
|
33
|
+
export function createRoomsInStore(store, editor, storeyId, rooms) {
|
|
34
|
+
if (rooms.length > 10000)
|
|
35
|
+
throw new Error('Room batch exceeds 10000 rooms');
|
|
36
|
+
return editor.runAtomic(draft => {
|
|
37
|
+
const anchor = resolveSpatialAnchor(store, storeyId, draft.getMutationView());
|
|
38
|
+
return rooms.map(room => addSpaceToStore(draft, anchor, {
|
|
39
|
+
Profile: 'polygon', OuterCurve: room.outline, Position: [0, 0, room.z], Height: room.height, Name: room.Name,
|
|
40
|
+
...(room.PredefinedType !== undefined ? { PredefinedType: room.PredefinedType } : {}),
|
|
41
|
+
...(room.ObjectType ? { ObjectType: room.ObjectType } : room.derived ? { ObjectType: GENERATED_SPACE_OBJECTTYPE } : {}),
|
|
42
|
+
grossFloorArea: room.grossArea, netFloorArea: room.netArea,
|
|
43
|
+
}).spaceId);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function setRoomAreasInStore(editor, id, areas, height) {
|
|
47
|
+
const view = editor.getMutationView(), qto = 'Qto_SpaceBaseQuantities';
|
|
48
|
+
view.setQuantity(id, qto, 'GrossFloorArea', areas.grossArea, QuantityType.Area);
|
|
49
|
+
view.setQuantity(id, qto, 'NetFloorArea', areas.netArea, QuantityType.Area);
|
|
50
|
+
view.setQuantity(id, qto, 'GrossVolume', areas.grossArea * height, QuantityType.Volume);
|
|
51
|
+
}
|
|
52
|
+
/** Preserve root identity, placement, metadata and links while replacing only its profile. */
|
|
53
|
+
export function rewriteRoomOutlineInStore(store, editor, id, chain, outline, areas) {
|
|
54
|
+
const ownership = editOwnershipRefusal(store, editor.getMutationView(), [chain.extrudedSolidId], new Set([id]));
|
|
55
|
+
if (ownership)
|
|
56
|
+
throw new Error(ownership);
|
|
57
|
+
const origin = chain.placementOrigin;
|
|
58
|
+
const emitted = emitClippedProfile(editor, outline, origin, chain.baseElevation - origin[2], getModelLengthUnitScale(store));
|
|
59
|
+
editor.setPositionalAttribute(chain.extrudedSolidId, 0, `#${emitted.profile}`);
|
|
60
|
+
editor.setPositionalAttribute(chain.extrudedSolidId, 1, `#${emitted.solidPosition}`);
|
|
61
|
+
editor.setPositionalAttribute(chain.extrudedSolidId, 2, `#${emitted.up}`);
|
|
62
|
+
setRoomAreasInStore(editor, id, areas, chain.thickness);
|
|
63
|
+
}
|
|
64
|
+
export function updateRoomOutlineInStore(store, editor, id, boundary, roomsOn) {
|
|
65
|
+
return editor.runAtomic(draft => {
|
|
66
|
+
const target = roomChainInStore(store, draft, id);
|
|
67
|
+
if (!target.ok)
|
|
68
|
+
return target;
|
|
69
|
+
const room = roomAt(roomsOn(target.storeyId), interiorPoint(target.chain.footprint));
|
|
70
|
+
if (!room)
|
|
71
|
+
return { ok: false, reason: 'noRoom' };
|
|
72
|
+
const outline = roomOutline(room, boundary);
|
|
73
|
+
rewriteRoomOutlineInStore(store, draft, id, target.chain, outline, room);
|
|
74
|
+
return { ok: true, outline };
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function dropCollinear(ring) {
|
|
78
|
+
const out = ring.filter((p, i) => {
|
|
79
|
+
const a = ring[(i + ring.length - 1) % ring.length], b = ring[(i + 1) % ring.length];
|
|
80
|
+
const cross = (p[0] - a[0]) * (b[1] - a[1]) - (p[1] - a[1]) * (b[0] - a[0]);
|
|
81
|
+
return Math.abs(cross) > 1e-9 * Math.max(1, Math.hypot(b[0] - a[0], b[1] - a[1]));
|
|
82
|
+
});
|
|
83
|
+
return out.length >= 3 ? out : [...ring];
|
|
84
|
+
}
|
|
85
|
+
const outlineOf = (face, link) => dropCollinear(roomOutline(face, link.boundary));
|
|
86
|
+
const ringKey = (ring) => ring.map(p => `${p[0].toFixed(4)},${p[1].toFixed(4)}`).join(';');
|
|
87
|
+
const areasOf = (face) => ({ grossArea: polyArea(face.centre), netArea: polyArea(face.inner) });
|
|
88
|
+
function chainOf(store, editor, id) {
|
|
89
|
+
const target = roomChainInStore(store, editor, id);
|
|
90
|
+
if (!target.ok)
|
|
91
|
+
throw new Error(`Room layout refuses unsupported ${target.reason} for #${id}`);
|
|
92
|
+
return target.chain;
|
|
93
|
+
}
|
|
94
|
+
function faceHolding(faces, p) {
|
|
95
|
+
let hit = null;
|
|
96
|
+
for (const face of faces)
|
|
97
|
+
if (pointInPoly(p[0], p[1], face.centre) && (!hit || polyArea(face.centre) < polyArea(hit.centre)))
|
|
98
|
+
hit = face;
|
|
99
|
+
return hit;
|
|
100
|
+
}
|
|
101
|
+
/** Native layout edit keeps the larger split/merged room identity and its metadata. */
|
|
102
|
+
export function syncRoomLayoutInStore(store, editor, before, after, globalIdScopes = [], editedStoreyId) {
|
|
103
|
+
return editor.runAtomic(draft => {
|
|
104
|
+
const out = { created: [], deleted: [], remesh: [] }, view = draft.getMutationView();
|
|
105
|
+
const seen = new Set(view.getMutations().map(mutation => mutation.id));
|
|
106
|
+
const pre = new Map(before.map(c => [c.face, c])), post = new Map(after.map(f => [f.face, f]));
|
|
107
|
+
const removed = before.filter(c => !post.has(c.face)), handled = new Set();
|
|
108
|
+
for (const face of after) {
|
|
109
|
+
if (pre.has(face.face))
|
|
110
|
+
continue;
|
|
111
|
+
const parent = faceHolding(before, interiorPoint(face.inner.length >= 3 ? face.inner : face.centre));
|
|
112
|
+
const kept = parent ? post.get(parent.face) : undefined;
|
|
113
|
+
if (!parent?.room || !kept || handled.has(kept.face))
|
|
114
|
+
continue;
|
|
115
|
+
const { room: link } = parent, chain = chainOf(store, draft, link.expressId);
|
|
116
|
+
const keepFirst = keepsFirstPiece(polyArea(outlineOf(kept, link)), polyArea(outlineOf(face, link)));
|
|
117
|
+
const [keptFace, cutFace] = keepFirst ? [kept, face] : [face, kept];
|
|
118
|
+
const attrs = readAttributes(store, view, draft, link.expressId);
|
|
119
|
+
if (!attrs)
|
|
120
|
+
throw new Error('Room layout refuses unreadable source attributes');
|
|
121
|
+
const classification = attrs[9];
|
|
122
|
+
if (classification != null && typeof classification !== 'string')
|
|
123
|
+
throw new Error('Room layout refuses invalid classification');
|
|
124
|
+
const schema = store.schemaVersion;
|
|
125
|
+
const registry = getSchemaRegistryForVersion(schema === 'IFC2X3' || schema === 'IFC4X3' ? schema : 'IFC4');
|
|
126
|
+
if (classification == null && !registry.entities.IfcSpace.allAttributes[9].optional)
|
|
127
|
+
throw new Error('Room layout requires source classification');
|
|
128
|
+
const target = roomChainInStore(store, draft, link.expressId);
|
|
129
|
+
if (!target.ok)
|
|
130
|
+
throw new Error('Room layout requires a storey');
|
|
131
|
+
const added = addSpaceToStore(draft, resolveSpatialAnchor(store, target.storeyId, view), {
|
|
132
|
+
Profile: 'polygon', Position: [0, 0, chain.baseElevation], OuterCurve: outlineOf(cutFace, link), Height: chain.thickness,
|
|
133
|
+
...(typeof attrs[2] === 'string' ? { Name: attrs[2] } : {}),
|
|
134
|
+
...(typeof classification === 'string' ? { PredefinedType: classification.replace(/^\.|\.$/g, '') } : {}),
|
|
135
|
+
...(typeof attrs[4] === 'string' ? { ObjectType: attrs[4] } : {}),
|
|
136
|
+
GlobalId: deriveSplitGlobalId(typeof attrs[0] === 'string' ? attrs[0] : String(link.expressId), globalIdTakenIn([{ dataStore: store, view }, ...globalIdScopes])),
|
|
137
|
+
}).spaceId;
|
|
138
|
+
if (classification == null)
|
|
139
|
+
draft.setPositionalAttribute(added, 9, null);
|
|
140
|
+
rewriteRoomOutlineInStore(store, draft, link.expressId, chain, outlineOf(keptFace, link), areasOf(keptFace));
|
|
141
|
+
cloneElementMetadata(store, view, draft, link.expressId, [added]);
|
|
142
|
+
setRoomAreasInStore(draft, added, areasOf(cutFace), chain.thickness);
|
|
143
|
+
handled.add(kept.face).add(face.face);
|
|
144
|
+
out.created.push(added);
|
|
145
|
+
out.remesh.push(link.expressId, added);
|
|
146
|
+
}
|
|
147
|
+
for (const face of after) {
|
|
148
|
+
if (handled.has(face.face))
|
|
149
|
+
continue;
|
|
150
|
+
const own = pre.get(face.face), absorbed = removed.filter(r => pointInPoly(r.interior[0], r.interior[1], face.centre));
|
|
151
|
+
const sources = [...(own ? [own] : []), ...absorbed];
|
|
152
|
+
const links = [...new Map(sources.flatMap(c => c.room ? [[c.room.expressId, c.room]] : [])).values()];
|
|
153
|
+
if (links.length === 0 || (absorbed.length === 0 && own && ringKey(own.centre) === ringKey(face.centre)))
|
|
154
|
+
continue;
|
|
155
|
+
const chains = links.map(link => ({ link, chain: chainOf(store, draft, link.expressId) }));
|
|
156
|
+
chains.sort((x, y) => polyArea(y.chain.footprint) - polyArea(x.chain.footprint));
|
|
157
|
+
const [{ link, chain }, ...merged] = chains;
|
|
158
|
+
rewriteRoomOutlineInStore(store, draft, link.expressId, chain, outlineOf(face, link), areasOf(face));
|
|
159
|
+
out.remesh.push(link.expressId);
|
|
160
|
+
for (const entry of merged) {
|
|
161
|
+
if (!draft.removeEntity(entry.link.expressId))
|
|
162
|
+
throw new Error('Room layout could not remove merged room');
|
|
163
|
+
out.deleted.push(entry.link.expressId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Native callers pass the storey after a changed layout operation.
|
|
167
|
+
if (editedStoreyId !== undefined && !view.getMutations().some(mutation => !seen.has(mutation.id))) {
|
|
168
|
+
recordSessionMutation(view, editedStoreyId, 'room-layout');
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=room-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-store.js","sourceRoot":"","sources":["../../src/in-store/room-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MutablePropertyView } from '@ifc-lite/mutations';
|
|
2
|
+
import { type IfcDataStore } from '@ifc-lite/parser';
|
|
3
|
+
/** Renderer-frame floor height for a live storey, including authored Elevation. */
|
|
4
|
+
export declare function effectiveStoreyElevation(store: IfcDataStore, view: MutablePropertyView | null | undefined, storeyId: number): number;
|
|
5
|
+
//# sourceMappingURL=room-storey-elevation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-storey-elevation.d.ts","sourceRoot":"","sources":["../../src/in-store/room-storey-elevation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAiD,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpG,mFAAmF;AACnF,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,EAC5C,QAAQ,EAAE,MAAM,GACf,MAAM,CAkCR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { EntityExtractor, resolveEffectiveEntityRecord } from '@ifc-lite/parser';
|
|
5
|
+
/** Renderer-frame floor height for a live storey, including authored Elevation. */
|
|
6
|
+
export function effectiveStoreyElevation(store, view, storeyId) {
|
|
7
|
+
const created = view?.getNewEntity(storeyId);
|
|
8
|
+
const retype = view?.getEntityTypeMutation(storeyId)?.newType;
|
|
9
|
+
const named = view?.getAttributeMutationsForEntity(storeyId) ?? [];
|
|
10
|
+
const positional = view?.getPositionalMutationsForEntity(storeyId);
|
|
11
|
+
// Hover raycasts ask for this floor repeatedly. The parsed hierarchy is
|
|
12
|
+
// already in metres, so avoid extracting an unchanged source record.
|
|
13
|
+
if (!created && !retype && !positional?.has(9)
|
|
14
|
+
&& !named.some(({ name }) => name === 'Elevation')) {
|
|
15
|
+
return store.spatialHierarchy?.storeyElevations.get(storeyId) ?? 0;
|
|
16
|
+
}
|
|
17
|
+
// @raw-entity-enumeration-ok point lookup for the already-selected effective storey's source record
|
|
18
|
+
const ref = created ? undefined : store.entityIndex.byId.get(storeyId)
|
|
19
|
+
?? store.deferredEntityIndex?.get(storeyId);
|
|
20
|
+
const source = ref && store.source.byteLength > 0
|
|
21
|
+
? new EntityExtractor(store.source).extractEntity(ref)
|
|
22
|
+
: null;
|
|
23
|
+
const entity = created ?? source;
|
|
24
|
+
if (entity) {
|
|
25
|
+
const record = resolveEffectiveEntityRecord(entity, {
|
|
26
|
+
retype,
|
|
27
|
+
named: named.map(({ name, value }) => [name, value]),
|
|
28
|
+
positional: positional ?? [],
|
|
29
|
+
}, store.schemaVersion);
|
|
30
|
+
const value = record.attributes[9]; // IfcBuildingStorey.Elevation in IFC2X3/IFC4.
|
|
31
|
+
const raw = typeof value === 'number' ? value
|
|
32
|
+
: typeof value === 'string' && value.trim() ? Number(value)
|
|
33
|
+
: value && typeof value === 'object' && 'real' in value && typeof value.real === 'number'
|
|
34
|
+
? value.real
|
|
35
|
+
: Array.isArray(value) && typeof value[1] === 'number' ? value[1] : undefined;
|
|
36
|
+
if (raw !== undefined && Number.isFinite(raw))
|
|
37
|
+
return raw * (store.lengthUnitScale ?? 1);
|
|
38
|
+
}
|
|
39
|
+
// The parsed hierarchy also includes ObjectPlacement-Z when Elevation is null.
|
|
40
|
+
return store.spatialHierarchy?.storeyElevations.get(storeyId) ?? 0;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=room-storey-elevation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-storey-elevation.js","sourceRoot":"","sources":["../../src/in-store/room-storey-elevation.ts"],"names":[],"mappings":"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"}
|