@ifc-lite/create 4.0.0 → 5.1.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 +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/duplicate.d.ts +8 -0
- package/dist/in-store/duplicate.d.ts.map +1 -1
- package/dist/in-store/duplicate.js +8 -1
- package/dist/in-store/duplicate.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 +142 -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 +45 -0
- package/dist/in-store/element-transform-frames.d.ts.map +1 -0
- package/dist/in-store/element-transform-frames.js +121 -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 +207 -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 +58 -10
- 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 +5 -17
- package/dist/in-store/placement-frame.d.ts.map +1 -1
- package/dist/in-store/placement-frame.js +59 -43
- 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/resolve-source.d.ts.map +1 -1
- package/dist/in-store/resolve-source.js +10 -3
- package/dist/in-store/resolve-source.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/dist/landxml/profile-geometry.d.ts +10 -0
- package/dist/landxml/profile-geometry.d.ts.map +1 -1
- package/dist/landxml/profile-geometry.js +16 -1
- package/dist/landxml/profile-geometry.js.map +1 -1
- package/package.json +9 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-source.d.ts","sourceRoot":"","sources":["../../src/in-store/resolve-source.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"resolve-source.d.ts","sourceRoot":"","sources":["../../src/in-store/resolve-source.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,EAAuG,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC1J,OAAO,EAAqD,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG1G,OAAO,KAAK,EAAE,gBAAgB,EAA2B,MAAM,gBAAgB,CAAC;AA+BhF;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,gBAAgB,CA8HlB"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* Lives in @ifc-lite/create alongside the in-store builders so the
|
|
12
12
|
* backend layer can call it without needing parser internals.
|
|
13
13
|
*/
|
|
14
|
-
import { EntityExtractor, effectiveStoreyId, resolveEffectiveRelationshipOverlay } from '@ifc-lite/parser';
|
|
14
|
+
import { EntityExtractor, effectiveStoreyId, propertyDefinitionsInModel, resolveEffectiveRelationshipOverlay } from '@ifc-lite/parser';
|
|
15
15
|
import { iterateEffectiveEntityIds } from '@ifc-lite/mutations';
|
|
16
16
|
import { resolvedTypeName } from '@ifc-lite/data';
|
|
17
17
|
import { asRef, createStyleEntityReader, refList } from './style-entity-reader.js';
|
|
@@ -183,11 +183,17 @@ function collectSourceAssociations(store, extractor, sourceId, editor) {
|
|
|
183
183
|
if (!refList(entity.attributes[4]).includes(sourceId))
|
|
184
184
|
continue;
|
|
185
185
|
const ownerHistoryId = asRef(entity.attributes[1]);
|
|
186
|
-
|
|
186
|
+
// RelatingPropertyDefinition is an IfcPropertySetDefinitionSelect: one
|
|
187
|
+
// reference, a bare set or IFCPROPERTYSETDEFINITIONSET((...)) (#7681).
|
|
188
|
+
// Every other Relating* slot is one reference.
|
|
189
|
+
const relatingExpressIds = type.toUpperCase() === 'IFCRELDEFINESBYPROPERTIES'
|
|
190
|
+
? propertyDefinitionsInModel(store, entity.attributes[5], view, asRef)
|
|
191
|
+
: [asRef(entity.attributes[5])].filter((id) => id !== null);
|
|
192
|
+
const relatingExpressId = relatingExpressIds[0];
|
|
187
193
|
// RelatingPropertyDefinition / RelatingType / etc. is required
|
|
188
194
|
// by the schema, so a missing one is a hard skip. OwnerHistory
|
|
189
195
|
// is optional (IFC4) — null is fine and round-trips cleanly.
|
|
190
|
-
if (relatingExpressId ===
|
|
196
|
+
if (relatingExpressId === undefined)
|
|
191
197
|
continue;
|
|
192
198
|
const name = typeof entity.attributes[2] === 'string' ? entity.attributes[2] : null;
|
|
193
199
|
const description = typeof entity.attributes[3] === 'string' ? entity.attributes[3] : null;
|
|
@@ -201,6 +207,7 @@ function collectSourceAssociations(store, extractor, sourceId, editor) {
|
|
|
201
207
|
name,
|
|
202
208
|
description,
|
|
203
209
|
relatingExpressId,
|
|
210
|
+
...(relatingExpressIds.length > 1 ? { relatingExpressIds } : {}),
|
|
204
211
|
});
|
|
205
212
|
}
|
|
206
213
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-source.js","sourceRoot":"","sources":["../../src/in-store/resolve-source.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mCAAmC,EAAqB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-source.js","sourceRoot":"","sources":["../../src/in-store/resolve-source.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,mCAAmC,EAAqB,MAAM,kBAAkB,CAAC;AAC1J,OAAO,EAAE,yBAAyB,EAA4C,MAAM,qBAAqB,CAAC;AAC1G,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,qBAAqB,GAAG;IAC5B,2BAA2B,EAAM,6CAA6C;IAC9E,qBAAqB,EAAY,eAAe;IAChD,0BAA0B;IAC1B,gCAAgC;IAChC,0BAA0B;CAClB,CAAC;AAEX,gGAAgG;AAChG,SAAS,QAAQ,CAAC,CAAU;IAC1B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,CAAgC;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAmB,EACnB,eAAuB,EACvB,MAAoB;IAEpB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,EAAE,eAAe,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,cAAc,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpD,4EAA4E;IAC5E,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAU,EAAE,EAAE;QAC5E,mIAAmI;QACnI,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,eAAe,YAAY,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,UAAU,CAAwB,CAAC;IAClE,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,0EAA0E;IAC1E,yEAAyE;IACzE,KAAK,CAAC,CAAC,CAAC,GAAG,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC;IACjE,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,EAAE,CAAC;IAErE,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,4BAA4B,eAAe,6DAA6D,CACzG,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC;IAE7B,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,WAAW,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAG,iBAAiB;IACnF,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAK,oBAAoB;IACtF,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,sCAAsC,WAAW,2BAA2B,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,gDAAgD,eAAe,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,+BAA+B;IACpF,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAK,kBAAkB;IAC1E,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0BAA0B;IAEtF,IAAI,cAAc,GAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,cAAc,GAAG;gBACf,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC;gBAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC;gBAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAsB,CAAC,IAAI,CAAC;aAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,IAAI,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7F,MAAM,cAAc,GAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACjD,aAAa,EAAE,mCAAmC,CAAC,KAAK,EAAE;YACxD,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE;YAC5C,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnF,eAAe,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,EAAE,CAAC;iBACrE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC;YACnD,oBAAoB,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,CAAC,IAAI,EAAE;YACpF,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,OAAO;YACnE,SAAS,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SAC9C,CAAC;QACF,SAAS,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7C,QAAQ,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAAE,OAAO;eAC5D,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;KAC5D,CAAC,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,cAAc,CAAC,IAAI,IAAI,CAAC;IAEnF,gEAAgE;IAChE,mEAAmE;IACnE,kEAAkE;IAClE,kBAAkB;IAClB,MAAM,YAAY,GAAG,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAE1F,kEAAkE;IAClE,+DAA+D;IAC/D,kEAAkE;IAClE,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,wBAAwB,CAAC,IAAI,GAAG,CAAC;IAE9G,gEAAgE;IAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;IACpF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4BAA4B,eAAe,gDAAgD,CAC5F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,KAAK;QACjB,kBAAkB,EAAE,WAAW;QAC/B,iBAAiB;QACjB,cAAc;QACd,gBAAgB;QAChB,cAAc;QACd,OAAO;QACP,eAAe;QACf,QAAQ;QACR,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,yBAAyB,CAChC,KAAmB,EACnB,SAA0B,EAC1B,QAAgB,EAChB,MAA+B;IAE/B,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,6EAA6E;IAC7E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,MAAM,EAAE,eAAe,EAAE,IAAI,IAAI,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM;QACjB,CAAC,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC;QACxC,CAAC,CAAC,CAAC,EAAU,EAAE,EAAE;YACf,sHAAsH;YACtH,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC,CAAC;IACJ,KAAK,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAAE,CAAC;QACvG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,4EAA4E;QAC5E,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEhE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,uEAAuE;QACvE,uEAAuE;QACvE,+CAA+C;QAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,2BAA2B;YAC3E,CAAC,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;YACtE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;QAC5E,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAChD,+DAA+D;QAC/D,+DAA+D;QAC/D,6DAA6D;QAC7D,IAAI,iBAAiB,KAAK,SAAS;YAAE,SAAS;QAE9C,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE3F,mEAAmE;QACnE,gEAAgE;QAChE,6DAA6D;QAC7D,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC;YACP,OAAO,EAAE,gBAAgB;YACzB,cAAc;YACd,IAAI;YACJ,WAAW;YACX,iBAAiB;YACjB,GAAG,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Pure candidate/link/occupancy policy shared by native Room hosts (#6232 D5). */
|
|
2
|
+
import type { SpaceFootprint } from './space-footprints.js';
|
|
3
|
+
import type { LayoutFace, Pt } from './room-layout-core.js';
|
|
4
|
+
export type RoomTriangle = [Pt, Pt, Pt];
|
|
5
|
+
/** A ring whose non-adjacent edges never cross: a polygon, not a point cloud. */
|
|
6
|
+
export declare function isSimpleRing(ring: readonly Pt[]): boolean;
|
|
7
|
+
/** Whether a plan point lies in a room that already exists. */
|
|
8
|
+
export declare function occupancyTest(rings: readonly Pt[][], triangles: readonly RoomTriangle[]): (p: Pt) => boolean;
|
|
9
|
+
/** The existing room a layout face is, and which wall face its outline follows. */
|
|
10
|
+
export interface RoomLink {
|
|
11
|
+
expressId: number;
|
|
12
|
+
boundary: 'inner' | 'center' | 'outer';
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Which existing room each layout face is: a room whose footprint holds the
|
|
16
|
+
* face's interior point AND whose area matches one of the face's three
|
|
17
|
+
* outlines (inner, axis, outer) to within `LINK_AREA_RATIO` — the outline it
|
|
18
|
+
* was written with. A room over several faces (one over the whole storey)
|
|
19
|
+
* matches none of them and links nowhere; a room links to one face at most,
|
|
20
|
+
* the closest match. Faces are `{ face, interior, inner, centre, outer }`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function linkFaces(faces: readonly {
|
|
23
|
+
face: number;
|
|
24
|
+
interior: Pt;
|
|
25
|
+
inner: Pt[];
|
|
26
|
+
centre: Pt[];
|
|
27
|
+
outer: Pt[];
|
|
28
|
+
}[], spaces: readonly {
|
|
29
|
+
expressId: number;
|
|
30
|
+
footprint: Pt[];
|
|
31
|
+
}[]): Map<number, RoomLink>;
|
|
32
|
+
/** Which wall face a room's outline follows: the room side, the axis, the far side. */
|
|
33
|
+
export type RoomBoundary = 'inner' | 'center' | 'outer';
|
|
34
|
+
export interface RoomCandidate extends LayoutFace {
|
|
35
|
+
/** Centreline area: the gross floor area. */
|
|
36
|
+
grossArea: number;
|
|
37
|
+
/** Inner-face area: the net floor area. */
|
|
38
|
+
netArea: number;
|
|
39
|
+
/** A point inside the face, for labels and the "already a room" test. */
|
|
40
|
+
interior: Pt;
|
|
41
|
+
/** An IfcSpace on the storey already covers this face. */
|
|
42
|
+
taken: boolean;
|
|
43
|
+
/** The existing room this face is (its outline), which layout edits reshape. */
|
|
44
|
+
room: RoomLink | null;
|
|
45
|
+
}
|
|
46
|
+
/** The outline a room is written with at `boundary`. */
|
|
47
|
+
export declare function roomOutline(room: LayoutFace, boundary: RoomBoundary): Pt[];
|
|
48
|
+
/**
|
|
49
|
+
* A point strictly inside `poly`: its vertex centroid when that is inside (a
|
|
50
|
+
* convex or mildly concave room), else the middle of the widest span of the
|
|
51
|
+
* horizontal line through it (an L- or U-shaped room).
|
|
52
|
+
*/
|
|
53
|
+
export declare function interiorPoint(poly: readonly Pt[]): Pt;
|
|
54
|
+
/** The smallest room whose centreline outline holds `p` (a room nested in another wins). */
|
|
55
|
+
export declare function roomAt<R extends RoomCandidate>(rooms: readonly R[], p: readonly [number, number]): R | null;
|
|
56
|
+
/** Layout faces → candidate rooms, `taken` where `occupied`, linked to the `spaces` they are. */
|
|
57
|
+
export declare function roomCandidatesFromFaces(faces: readonly LayoutFace[], occupied?: (p: Pt) => boolean, spaces?: readonly SpaceFootprint[]): RoomCandidate[];
|
|
58
|
+
//# sourceMappingURL=room-candidates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-candidates.d.ts","sourceRoot":"","sources":["../../src/in-store/room-candidates.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAQxC,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,OAAO,CAUzD;AAQD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,OAAO,CAG5G;AAED,mFAAmF;AACnF,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACxC;AAWD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,EAAE,EAAE,CAAC;IAAC,MAAM,EAAE,EAAE,EAAE,CAAC;IAAC,KAAK,EAAE,EAAE,EAAE,CAAA;CAAE,EAAE,EACxF,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,EAAE,EAAE,CAAA;CAAE,EAAE,GACxD,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAoBvB;AACD,uFAAuF;AACvF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,QAAQ,EAAE,EAAE,CAAC;IACb,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,GAAG,EAAE,EAAE,CAE1E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAkBrD;AAED,4FAA4F;AAC5F,wBAAgB,MAAM,CAAC,CAAC,SAAS,aAAa,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAM3G;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,QAAQ,GAAE,CAAC,CAAC,EAAE,EAAE,KAAK,OAAqB,EAC1C,MAAM,GAAE,SAAS,cAAc,EAAO,GACrC,aAAa,EAAE,CAajB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
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 { polygonArea as polyArea, pointInPolygon as pointInPoly } from './room-footprint-offset.js';
|
|
5
|
+
const cross = (o, a, b) => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
|
|
6
|
+
function segmentsCross(a, b, c, d) {
|
|
7
|
+
const d1 = cross(c, d, a), d2 = cross(c, d, b), d3 = cross(a, b, c), d4 = cross(a, b, d);
|
|
8
|
+
return ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0));
|
|
9
|
+
}
|
|
10
|
+
/** A ring whose non-adjacent edges never cross: a polygon, not a point cloud. */
|
|
11
|
+
export function isSimpleRing(ring) {
|
|
12
|
+
const n = ring.length;
|
|
13
|
+
if (n < 3)
|
|
14
|
+
return false;
|
|
15
|
+
for (let i = 0; i < n; i++) {
|
|
16
|
+
for (let j = i + 2; j < n; j++) {
|
|
17
|
+
if (i === 0 && j === n - 1)
|
|
18
|
+
continue;
|
|
19
|
+
if (segmentsCross(ring[i], ring[(i + 1) % n], ring[j], ring[(j + 1) % n]))
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
function inTriangle(p, [a, b, c]) {
|
|
26
|
+
const d1 = cross(a, b, p), d2 = cross(b, c, p), d3 = cross(c, a, p);
|
|
27
|
+
const neg = d1 < 0 || d2 < 0 || d3 < 0, pos = d1 > 0 || d2 > 0 || d3 > 0;
|
|
28
|
+
return !(neg && pos);
|
|
29
|
+
}
|
|
30
|
+
/** Whether a plan point lies in a room that already exists. */
|
|
31
|
+
export function occupancyTest(rings, triangles) {
|
|
32
|
+
const polygons = rings.filter(isSimpleRing);
|
|
33
|
+
return (p) => polygons.some((ring) => pointInPoly(p[0], p[1], ring)) || triangles.some((tri) => inTriangle(p, tri));
|
|
34
|
+
}
|
|
35
|
+
/** How far a room's area may be from its face's to still be that face's room. */
|
|
36
|
+
const LINK_AREA_RATIO = 0.25;
|
|
37
|
+
const ringArea = (ring) => {
|
|
38
|
+
let a = 0;
|
|
39
|
+
ring.forEach((p, i) => { const q = ring[(i + 1) % ring.length]; a += p[0] * q[1] - q[0] * p[1]; });
|
|
40
|
+
return Math.abs(a) / 2;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Which existing room each layout face is: a room whose footprint holds the
|
|
44
|
+
* face's interior point AND whose area matches one of the face's three
|
|
45
|
+
* outlines (inner, axis, outer) to within `LINK_AREA_RATIO` — the outline it
|
|
46
|
+
* was written with. A room over several faces (one over the whole storey)
|
|
47
|
+
* matches none of them and links nowhere; a room links to one face at most,
|
|
48
|
+
* the closest match. Faces are `{ face, interior, inner, centre, outer }`.
|
|
49
|
+
*/
|
|
50
|
+
export function linkFaces(faces, spaces) {
|
|
51
|
+
const best = new Map();
|
|
52
|
+
for (const f of faces) {
|
|
53
|
+
for (const space of spaces) {
|
|
54
|
+
if (!isSimpleRing(space.footprint) || !pointInPoly(f.interior[0], f.interior[1], space.footprint))
|
|
55
|
+
continue;
|
|
56
|
+
const area = ringArea(space.footprint);
|
|
57
|
+
for (const boundary of ['inner', 'center', 'outer']) {
|
|
58
|
+
const faceArea = ringArea(boundary === 'inner' ? f.inner : boundary === 'outer' ? f.outer : f.centre);
|
|
59
|
+
const err = Math.abs(area - faceArea) / Math.max(faceArea, 1e-9);
|
|
60
|
+
const held = best.get(space.expressId);
|
|
61
|
+
if (err <= LINK_AREA_RATIO && (!held || err < held.err))
|
|
62
|
+
best.set(space.expressId, { face: f.face, boundary, err });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const links = new Map();
|
|
67
|
+
for (const [expressId, { face, boundary, err }] of best) {
|
|
68
|
+
const held = links.get(face);
|
|
69
|
+
if (!held || err < held.err)
|
|
70
|
+
links.set(face, { expressId, boundary, err });
|
|
71
|
+
}
|
|
72
|
+
return new Map([...links].map(([face, { expressId, boundary }]) => [face, { expressId, boundary }]));
|
|
73
|
+
}
|
|
74
|
+
/** The outline a room is written with at `boundary`. */
|
|
75
|
+
export function roomOutline(room, boundary) {
|
|
76
|
+
return boundary === 'inner' ? room.inner : boundary === 'outer' ? room.outer : room.centre;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* A point strictly inside `poly`: its vertex centroid when that is inside (a
|
|
80
|
+
* convex or mildly concave room), else the middle of the widest span of the
|
|
81
|
+
* horizontal line through it (an L- or U-shaped room).
|
|
82
|
+
*/
|
|
83
|
+
export function interiorPoint(poly) {
|
|
84
|
+
const n = poly.length;
|
|
85
|
+
let cx = 0, cy = 0;
|
|
86
|
+
for (const p of poly) {
|
|
87
|
+
cx += p[0];
|
|
88
|
+
cy += p[1];
|
|
89
|
+
}
|
|
90
|
+
cx /= n;
|
|
91
|
+
cy /= n;
|
|
92
|
+
const ring = poly;
|
|
93
|
+
if (pointInPoly(cx, cy, ring))
|
|
94
|
+
return [cx, cy];
|
|
95
|
+
const xs = [];
|
|
96
|
+
for (let i = 0, j = n - 1; i < n; j = i++) {
|
|
97
|
+
const [xi, yi] = poly[i], [xj, yj] = poly[j];
|
|
98
|
+
if ((yi > cy) !== (yj > cy))
|
|
99
|
+
xs.push(xi + ((cy - yi) * (xj - xi)) / (yj - yi));
|
|
100
|
+
}
|
|
101
|
+
xs.sort((a, b) => a - b);
|
|
102
|
+
let best = [cx, cy], width = -1;
|
|
103
|
+
for (let k = 0; k + 1 < xs.length; k += 2) {
|
|
104
|
+
if (xs[k + 1] - xs[k] > width) {
|
|
105
|
+
width = xs[k + 1] - xs[k];
|
|
106
|
+
best = [(xs[k] + xs[k + 1]) / 2, cy];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return best;
|
|
110
|
+
}
|
|
111
|
+
/** The smallest room whose centreline outline holds `p` (a room nested in another wins). */
|
|
112
|
+
export function roomAt(rooms, p) {
|
|
113
|
+
let hit = null;
|
|
114
|
+
for (const room of rooms) {
|
|
115
|
+
if (pointInPoly(p[0], p[1], room.centre) && (!hit || room.grossArea < hit.grossArea))
|
|
116
|
+
hit = room;
|
|
117
|
+
}
|
|
118
|
+
return hit;
|
|
119
|
+
}
|
|
120
|
+
/** Layout faces → candidate rooms, `taken` where `occupied`, linked to the `spaces` they are. */
|
|
121
|
+
export function roomCandidatesFromFaces(faces, occupied = () => false, spaces = []) {
|
|
122
|
+
const withInterior = faces.map((face) => ({ ...face, interior: interiorPoint(face.inner.length >= 3 ? face.inner : face.centre) }));
|
|
123
|
+
const links = linkFaces(withInterior, spaces);
|
|
124
|
+
return withInterior.map((face) => {
|
|
125
|
+
const room = links.get(face.face) ?? null;
|
|
126
|
+
return {
|
|
127
|
+
...face,
|
|
128
|
+
grossArea: polyArea(face.centre),
|
|
129
|
+
netArea: polyArea(face.inner),
|
|
130
|
+
taken: room !== null || occupied(face.interior),
|
|
131
|
+
room,
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=room-candidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-candidates.js","sourceRoot":"","sources":["../../src/in-store/room-candidates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type RoomBoundary, type RoomCandidate } from './room-candidates.js';
|
|
2
|
+
import type { NewRoom } from './room-store.js';
|
|
3
|
+
export interface RoomCreationPlan {
|
|
4
|
+
readonly action: 'auto' | 'pick';
|
|
5
|
+
readonly point?: readonly [number, number];
|
|
6
|
+
readonly boundary: RoomBoundary;
|
|
7
|
+
readonly height: number;
|
|
8
|
+
readonly z: number;
|
|
9
|
+
readonly existingCount: number;
|
|
10
|
+
readonly namePattern: string;
|
|
11
|
+
readonly PredefinedType?: string;
|
|
12
|
+
readonly ObjectType?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Native faces, occupancy and one naming policy drive both public commands and previews. */
|
|
15
|
+
export declare function planRoomCreation(rooms: readonly RoomCandidate[], options: RoomCreationPlan): NewRoom[];
|
|
16
|
+
//# sourceMappingURL=room-creation-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-creation-plan.d.ts","sourceRoot":"","sources":["../../src/in-store/room-creation-plan.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,EAAE,CAiBtG"}
|
|
@@ -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 { roomAt, roomOutline } from './room-candidates.js';
|
|
5
|
+
/** Native faces, occupancy and one naming policy drive both public commands and previews. */
|
|
6
|
+
export function planRoomCreation(rooms, options) {
|
|
7
|
+
let chosen;
|
|
8
|
+
if (options.action === 'auto')
|
|
9
|
+
chosen = rooms.filter(room => !room.taken);
|
|
10
|
+
else {
|
|
11
|
+
if (!options.point)
|
|
12
|
+
throw new Error('Room pick requires a storey-local point');
|
|
13
|
+
const room = roomAt(rooms, options.point);
|
|
14
|
+
if (!room)
|
|
15
|
+
throw new Error('No room at this point');
|
|
16
|
+
if (room.taken)
|
|
17
|
+
throw new Error('This room already has an IfcSpace');
|
|
18
|
+
chosen = [room];
|
|
19
|
+
}
|
|
20
|
+
return chosen.map((room, i) => ({
|
|
21
|
+
outline: roomOutline(room, options.boundary), height: options.height, z: options.z,
|
|
22
|
+
Name: options.namePattern.replaceAll('{n}', String(options.existingCount + i + 1)),
|
|
23
|
+
...(options.PredefinedType !== undefined ? { PredefinedType: options.PredefinedType } : {}),
|
|
24
|
+
...(options.ObjectType !== undefined ? { ObjectType: options.ObjectType } : {}),
|
|
25
|
+
grossArea: room.grossArea, netArea: room.netArea, derived: true,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=room-creation-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-creation-plan.js","sourceRoot":"","sources":["../../src/in-store/room-creation-plan.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAyC,MAAM,sBAAsB,CAAC;AAelG,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB,CAAC,KAA+B,EAAE,OAAyB;IACzF,IAAI,MAAgC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrE,CAAC;QACJ,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACrE,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO,EAAE,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;QAClF,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3F,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI;KAChE,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floor-to-floor height for a storey, for the Room tool's derive band.
|
|
3
|
+
* Pure: no React, wasm, or viewer store.
|
|
4
|
+
*/
|
|
5
|
+
/** Floor-to-floor used when the storey list offers no usable one. */
|
|
6
|
+
export declare const BAKE_HEIGHT = 3;
|
|
7
|
+
/** A storey id with its elevation (metres). */
|
|
8
|
+
export interface StoreyElevation {
|
|
9
|
+
id: number;
|
|
10
|
+
elev: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Floor-to-floor for storey `sid`: the elevation gap to the storey above it in
|
|
14
|
+
* `storeys`, which the caller keeps sorted low → high.
|
|
15
|
+
*
|
|
16
|
+
* Falls back to {@link BAKE_HEIGHT} for the top storey, an unknown storey, and
|
|
17
|
+
* for a gap that cannot be a storey height. That guard is not cosmetic: this
|
|
18
|
+
* height is also the band `wallRectsFromMeshes` slices to find the storey's
|
|
19
|
+
* walls, so a zero/negative gap (two storeys at the same elevation, a common
|
|
20
|
+
* export artefact) would find no walls at all, and a 500 m gap (a storey
|
|
21
|
+
* elevation left in millimetres) would sweep the whole building into one plan.
|
|
22
|
+
*/
|
|
23
|
+
export declare function floorToFloorHeight(storeys: StoreyElevation[], sid: number): number;
|
|
24
|
+
//# sourceMappingURL=room-floor-height.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-floor-height.d.ts","sourceRoot":"","sources":["../../src/in-store/room-floor-height.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,qEAAqE;AACrE,eAAO,MAAM,WAAW,IAAI,CAAC;AAK7B,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
/**
|
|
5
|
+
* Floor-to-floor height for a storey, for the Room tool's derive band.
|
|
6
|
+
* Pure: no React, wasm, or viewer store.
|
|
7
|
+
*/
|
|
8
|
+
/** Floor-to-floor used when the storey list offers no usable one. */
|
|
9
|
+
export const BAKE_HEIGHT = 3;
|
|
10
|
+
/** A storey gap outside this range is a data artefact, not a floor height. */
|
|
11
|
+
const MIN_FLOOR_TO_FLOOR = 0.1;
|
|
12
|
+
const MAX_FLOOR_TO_FLOOR = 50;
|
|
13
|
+
/**
|
|
14
|
+
* Floor-to-floor for storey `sid`: the elevation gap to the storey above it in
|
|
15
|
+
* `storeys`, which the caller keeps sorted low → high.
|
|
16
|
+
*
|
|
17
|
+
* Falls back to {@link BAKE_HEIGHT} for the top storey, an unknown storey, and
|
|
18
|
+
* for a gap that cannot be a storey height. That guard is not cosmetic: this
|
|
19
|
+
* height is also the band `wallRectsFromMeshes` slices to find the storey's
|
|
20
|
+
* walls, so a zero/negative gap (two storeys at the same elevation, a common
|
|
21
|
+
* export artefact) would find no walls at all, and a 500 m gap (a storey
|
|
22
|
+
* elevation left in millimetres) would sweep the whole building into one plan.
|
|
23
|
+
*/
|
|
24
|
+
export function floorToFloorHeight(storeys, sid) {
|
|
25
|
+
const idx = storeys.findIndex((s) => s.id === sid);
|
|
26
|
+
if (idx < 0)
|
|
27
|
+
return BAKE_HEIGHT;
|
|
28
|
+
const next = storeys[idx + 1];
|
|
29
|
+
const ff = next ? next.elev - storeys[idx].elev : BAKE_HEIGHT;
|
|
30
|
+
return ff > MIN_FLOOR_TO_FLOOR && ff < MAX_FLOOR_TO_FLOOR ? ff : BAKE_HEIGHT;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=room-floor-height.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-floor-height.js","sourceRoot":"","sources":["../../src/in-store/room-floor-height.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAQ9B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0B,EAAE,GAAW;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IACnD,IAAI,GAAG,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,OAAO,EAAE,GAAG,kBAAkB,IAAI,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type RoomPlateFactory, type LayoutFace, type Pt } from './room-layout-core.js';
|
|
2
|
+
export interface RoomWallRect {
|
|
3
|
+
corners: Pt[];
|
|
4
|
+
centreline: [Pt, Pt];
|
|
5
|
+
thickness: number;
|
|
6
|
+
}
|
|
7
|
+
/** Convex hull (Andrew's monotone chain), CCW, of a plan point cloud. */
|
|
8
|
+
export declare function roomConvexHull(pts: Pt[]): Pt[];
|
|
9
|
+
/** Convex-hull exterior perimeter (CCW) of all wall-rectangle corners. */
|
|
10
|
+
export declare function exteriorPerimeter(rects: RoomWallRect[]): Pt[];
|
|
11
|
+
/**
|
|
12
|
+
* Emit the closed hull as a loop of thin synthetic walls (one per edge),
|
|
13
|
+
* centred on the hull edge, so `buildFromRects` encloses exactly one room whose
|
|
14
|
+
* outline is the hull. Returns null when the hull is degenerate (< 3 points).
|
|
15
|
+
*/
|
|
16
|
+
export declare function perimeterWalls(hull: Pt[], thickness?: number): RoomWallRect[] | null;
|
|
17
|
+
/** The one face over the storey's whole outline, from its walls (storey-local); null without walls. */
|
|
18
|
+
export declare function storeyFootprintFaceInStore(factory: RoomPlateFactory, walls: readonly RoomWallRect[], weld: number): LayoutFace | null;
|
|
19
|
+
//# sourceMappingURL=room-footprint-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-footprint-native.d.ts","sourceRoot":"","sources":["../../src/in-store/room-footprint-native.ts"],"names":[],"mappings":"AAMA,OAAO,EAA+C,KAAK,gBAAgB,EAAE,KAAK,UAAU,EAA4B,KAAK,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC/J,MAAM,WAAW,YAAY;IAAG,OAAO,EAAE,EAAE,EAAE,CAAC;IAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAExF,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAmB9C;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,SAAM,GAAG,YAAY,EAAE,GAAG,IAAI,CAyBjF;AAgCD,uGAAuG;AACvG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAMrI"}
|
|
@@ -0,0 +1,117 @@
|
|
|
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
|
+
/** The native Room footprint policy shared by all hosts (#6232 D5). */
|
|
5
|
+
import { polygonArea as polyArea } from './room-footprint-offset.js';
|
|
6
|
+
import { readFaces, flattenRoomRects } from './room-layout-core.js';
|
|
7
|
+
/** Convex hull (Andrew's monotone chain), CCW, of a plan point cloud. */
|
|
8
|
+
export function roomConvexHull(pts) {
|
|
9
|
+
const uniq = [...new Map(pts.map((p) => [`${p[0].toFixed(5)},${p[1].toFixed(5)}`, p])).values()]
|
|
10
|
+
.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
11
|
+
if (uniq.length < 3)
|
|
12
|
+
return uniq;
|
|
13
|
+
const cross = (o, a, b) => (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]);
|
|
14
|
+
const lower = [];
|
|
15
|
+
for (const p of uniq) {
|
|
16
|
+
while (lower.length >= 2 && cross(lower[lower.length - 2], lower[lower.length - 1], p) <= 0)
|
|
17
|
+
lower.pop();
|
|
18
|
+
lower.push(p);
|
|
19
|
+
}
|
|
20
|
+
const upper = [];
|
|
21
|
+
for (let i = uniq.length - 1; i >= 0; i--) {
|
|
22
|
+
const p = uniq[i];
|
|
23
|
+
while (upper.length >= 2 && cross(upper[upper.length - 2], upper[upper.length - 1], p) <= 0)
|
|
24
|
+
upper.pop();
|
|
25
|
+
upper.push(p);
|
|
26
|
+
}
|
|
27
|
+
lower.pop();
|
|
28
|
+
upper.pop();
|
|
29
|
+
return lower.concat(upper);
|
|
30
|
+
}
|
|
31
|
+
/** Convex-hull exterior perimeter (CCW) of all wall-rectangle corners. */
|
|
32
|
+
export function exteriorPerimeter(rects) {
|
|
33
|
+
return roomConvexHull(rects.flatMap((r) => r.corners));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Emit the closed hull as a loop of thin synthetic walls (one per edge),
|
|
37
|
+
* centred on the hull edge, so `buildFromRects` encloses exactly one room whose
|
|
38
|
+
* outline is the hull. Returns null when the hull is degenerate (< 3 points).
|
|
39
|
+
*/
|
|
40
|
+
export function perimeterWalls(hull, thickness = 0.2) {
|
|
41
|
+
if (hull.length < 3)
|
|
42
|
+
return null;
|
|
43
|
+
const half = thickness / 2;
|
|
44
|
+
const out = [];
|
|
45
|
+
for (let i = 0; i < hull.length; i++) {
|
|
46
|
+
const a = hull[i];
|
|
47
|
+
const b = hull[(i + 1) % hull.length];
|
|
48
|
+
const dx = b[0] - a[0];
|
|
49
|
+
const dy = b[1] - a[1];
|
|
50
|
+
const len = Math.hypot(dx, dy);
|
|
51
|
+
if (len < 1e-6)
|
|
52
|
+
continue;
|
|
53
|
+
// Unit normal to the edge.
|
|
54
|
+
const nx = -dy / len;
|
|
55
|
+
const ny = dx / len;
|
|
56
|
+
const ox = nx * half;
|
|
57
|
+
const oy = ny * half;
|
|
58
|
+
const corners = [
|
|
59
|
+
[a[0] + ox, a[1] + oy],
|
|
60
|
+
[b[0] + ox, b[1] + oy],
|
|
61
|
+
[b[0] - ox, b[1] - oy],
|
|
62
|
+
[a[0] - ox, a[1] - oy],
|
|
63
|
+
];
|
|
64
|
+
out.push({ corners, centreline: [a, b], thickness });
|
|
65
|
+
}
|
|
66
|
+
return out.length >= 3 ? out : null;
|
|
67
|
+
}
|
|
68
|
+
/** Merge every pair of rooms that share a wall, until none do. */
|
|
69
|
+
function mergeAll(h) {
|
|
70
|
+
for (let guard = h.roomIds().length; guard > 0; guard--) {
|
|
71
|
+
const rooms = new Set(h.roomIds());
|
|
72
|
+
let merged = false;
|
|
73
|
+
for (const room of h.snapshot()) {
|
|
74
|
+
for (const b of h.boundingElements(room.face)) {
|
|
75
|
+
const across = h.neighborAcross(b.edge);
|
|
76
|
+
if (across === undefined || across === room.face || !rooms.has(across))
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
h.mergeFaces(b.edge);
|
|
80
|
+
merged = true;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.debug('[room.footprint] enclosing wall retained', error);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (merged)
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (!merged)
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** The largest face of a plate built from `rects` after `edit`, freed before returning. */
|
|
96
|
+
function largestFace(factory, rects, weld, edit) {
|
|
97
|
+
const plate = factory.fromWallRects(flattenRoomRects(rects), weld, .3);
|
|
98
|
+
try {
|
|
99
|
+
edit(plate);
|
|
100
|
+
const faces = readFaces(plate);
|
|
101
|
+
return faces.reduce((best, f) => (!best || polyArea(f.centre) > polyArea(best.centre) ? f : best), null);
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
plate.free();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** The one face over the storey's whole outline, from its walls (storey-local); null without walls. */
|
|
108
|
+
export function storeyFootprintFaceInStore(factory, walls, weld) {
|
|
109
|
+
if (walls.length === 0)
|
|
110
|
+
return null;
|
|
111
|
+
const merged = largestFace(factory, walls.map((w) => w.corners), weld, (h) => { mergeAll(h); h.prune(); });
|
|
112
|
+
if (merged)
|
|
113
|
+
return merged;
|
|
114
|
+
const hull = perimeterWalls(exteriorPerimeter([...walls]));
|
|
115
|
+
return hull ? largestFace(factory, hull.map((w) => w.corners), weld, () => { }) : null;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=room-footprint-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-footprint-native.js","sourceRoot":"","sources":["../../src/in-store/room-footprint-native.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,uEAAuE;AACvE,OAAO,EAAE,WAAW,IAAI,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAA6F,MAAM,uBAAuB,CAAC;AAG/J,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,GAAS;IACtC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC7F,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,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;IACrG,MAAM,KAAK,GAAS,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAS,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,GAAG,EAAE,CAAC;IACZ,KAAK,CAAC,GAAG,EAAE,CAAC;IACZ,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,OAAO,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAe,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU,EAAE,SAAS,GAAG,GAAG;IACxD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/B,IAAI,GAAG,GAAG,IAAI;YAAE,SAAS;QACzB,2BAA2B;QAC3B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;QACpB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAS;YACpB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;SACvB,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACtC,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CAAC,CAAY;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,QAAQ,EAAY,EAAE,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAe,EAAE,CAAC;gBAC5D,MAAM,MAAM,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACjF,IAAI,CAAC;oBAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;gBAAC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC1I,MAAM;YACR,CAAC;YACD,IAAI,MAAM;gBAAE,MAAM;QACpB,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,OAAO;IACtB,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,SAAS,WAAW,CAAC,OAAyB,EAAE,KAA+C,EAAE,IAAY,EAAE,IAA4B;IACzI,MAAM,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,MAAM,CAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9H,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC;AACH,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,0BAA0B,CAAC,OAAyB,EAAE,KAA8B,EAAE,IAAY;IAChH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** One bounded native-plate ownership/history policy for all Room hosts (#6232 D5). */
|
|
2
|
+
import { type LayoutFace, type RoomPlate, type RoomPlateFactory, type Pt } from './room-layout-core.js';
|
|
3
|
+
export interface RetainedRoomLayout {
|
|
4
|
+
readonly walls: string;
|
|
5
|
+
readonly plate: RoomPlate;
|
|
6
|
+
readonly faces: LayoutFace[];
|
|
7
|
+
}
|
|
8
|
+
export declare function roomWallsSignature(rects: readonly (readonly Pt[])[]): string;
|
|
9
|
+
/** Every retained handle is freed on replacement, eviction, model removal or dispose. */
|
|
10
|
+
export declare class RoomLayoutCache {
|
|
11
|
+
private readonly scopes;
|
|
12
|
+
private revision;
|
|
13
|
+
version(): number;
|
|
14
|
+
private scope;
|
|
15
|
+
private drop;
|
|
16
|
+
private retain;
|
|
17
|
+
read(modelId: string, storeyId: number, weld: number, head: string, rects: readonly (readonly Pt[])[], factory: RoomPlateFactory): RetainedRoomLayout;
|
|
18
|
+
/** Transfer ownership only after the IFC/history commit has succeeded. */
|
|
19
|
+
file(modelId: string, storeyId: number, weld: number, head: string, walls: string, plate: RoomPlate, faces: LayoutFace[]): void;
|
|
20
|
+
clearModel(modelId: string): void;
|
|
21
|
+
clear(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=room-layout-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room-layout-cache.d.ts","sourceRoot":"","sources":["../../src/in-store/room-layout-cache.ts"],"names":[],"mappings":"AAIA,uFAAuF;AACvF,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAErI,MAAM,WAAW,kBAAkB;IAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE;AAGvH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM,CAE5E;AAED,yFAAyF;AACzF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,IAAI,MAAM;IACjB,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,MAAM;IAQd,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,kBAAkB;IAcrJ,0EAA0E;IAC1E,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;IAI/H,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQjC,KAAK,IAAI,IAAI;CAKd"}
|