@ifc-lite/create 3.2.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.
Files changed (426) hide show
  1. package/README.md +43 -0
  2. package/dist/in-store/align-boxes.d.ts +38 -0
  3. package/dist/in-store/align-boxes.d.ts.map +1 -0
  4. package/dist/in-store/align-boxes.js +97 -0
  5. package/dist/in-store/align-boxes.js.map +1 -0
  6. package/dist/in-store/anchor.d.ts.map +1 -1
  7. package/dist/in-store/anchor.js +13 -2
  8. package/dist/in-store/anchor.js.map +1 -1
  9. package/dist/in-store/auto-space-detect.d.ts +1 -1
  10. package/dist/in-store/auto-space-detect.js +1 -1
  11. package/dist/in-store/beam.d.ts +10 -1
  12. package/dist/in-store/beam.d.ts.map +1 -1
  13. package/dist/in-store/beam.js +17 -35
  14. package/dist/in-store/beam.js.map +1 -1
  15. package/dist/in-store/column.d.ts +10 -1
  16. package/dist/in-store/column.d.ts.map +1 -1
  17. package/dist/in-store/column.js +23 -22
  18. package/dist/in-store/column.js.map +1 -1
  19. package/dist/in-store/copy-array.d.ts +17 -0
  20. package/dist/in-store/copy-array.d.ts.map +1 -0
  21. package/dist/in-store/copy-array.js +47 -0
  22. package/dist/in-store/copy-array.js.map +1 -0
  23. package/dist/in-store/copy-batch.d.ts +27 -0
  24. package/dist/in-store/copy-batch.d.ts.map +1 -0
  25. package/dist/in-store/copy-batch.js +101 -0
  26. package/dist/in-store/copy-batch.js.map +1 -0
  27. package/dist/in-store/copy-dependent-walk.d.ts +27 -0
  28. package/dist/in-store/copy-dependent-walk.d.ts.map +1 -0
  29. package/dist/in-store/copy-dependent-walk.js +61 -0
  30. package/dist/in-store/copy-dependent-walk.js.map +1 -0
  31. package/dist/in-store/copy-frame.d.ts +53 -0
  32. package/dist/in-store/copy-frame.d.ts.map +1 -0
  33. package/dist/in-store/copy-frame.js +112 -0
  34. package/dist/in-store/copy-frame.js.map +1 -0
  35. package/dist/in-store/copy-product.d.ts +76 -0
  36. package/dist/in-store/copy-product.d.ts.map +1 -0
  37. package/dist/in-store/copy-product.js +318 -0
  38. package/dist/in-store/copy-product.js.map +1 -0
  39. package/dist/in-store/curtain-wall.d.ts +87 -0
  40. package/dist/in-store/curtain-wall.d.ts.map +1 -0
  41. package/dist/in-store/curtain-wall.js +237 -0
  42. package/dist/in-store/curtain-wall.js.map +1 -0
  43. package/dist/in-store/edit/effective-mutation-view.d.ts +6 -0
  44. package/dist/in-store/edit/effective-mutation-view.d.ts.map +1 -0
  45. package/dist/in-store/edit/effective-mutation-view.js +45 -0
  46. package/dist/in-store/edit/effective-mutation-view.js.map +1 -0
  47. package/dist/in-store/edit/effective-storey.d.ts +13 -0
  48. package/dist/in-store/edit/effective-storey.d.ts.map +1 -0
  49. package/dist/in-store/edit/effective-storey.js +36 -0
  50. package/dist/in-store/edit/effective-storey.js.map +1 -0
  51. package/dist/in-store/edit/effective-storeys.d.ts +9 -0
  52. package/dist/in-store/edit/effective-storeys.d.ts.map +1 -0
  53. package/dist/in-store/edit/effective-storeys.js +16 -0
  54. package/dist/in-store/edit/effective-storeys.js.map +1 -0
  55. package/dist/in-store/edit/hosted-opening-refit.d.ts +29 -0
  56. package/dist/in-store/edit/hosted-opening-refit.d.ts.map +1 -0
  57. package/dist/in-store/edit/hosted-opening-refit.js +168 -0
  58. package/dist/in-store/edit/hosted-opening-refit.js.map +1 -0
  59. package/dist/in-store/edit/length-unit-scale.d.ts +24 -0
  60. package/dist/in-store/edit/length-unit-scale.d.ts.map +1 -0
  61. package/dist/in-store/edit/length-unit-scale.js +37 -0
  62. package/dist/in-store/edit/length-unit-scale.js.map +1 -0
  63. package/dist/in-store/edit/linear-element-edit.d.ts +131 -0
  64. package/dist/in-store/edit/linear-element-edit.d.ts.map +1 -0
  65. package/dist/in-store/edit/linear-element-edit.js +259 -0
  66. package/dist/in-store/edit/linear-element-edit.js.map +1 -0
  67. package/dist/in-store/edit/metadata-clone-effective.d.ts +5 -0
  68. package/dist/in-store/edit/metadata-clone-effective.d.ts.map +1 -0
  69. package/dist/in-store/edit/metadata-clone-effective.js +47 -0
  70. package/dist/in-store/edit/metadata-clone-effective.js.map +1 -0
  71. package/dist/in-store/edit/metadata-clone.d.ts +40 -0
  72. package/dist/in-store/edit/metadata-clone.d.ts.map +1 -0
  73. package/dist/in-store/edit/metadata-clone.js +107 -0
  74. package/dist/in-store/edit/metadata-clone.js.map +1 -0
  75. package/dist/in-store/edit/placement-core.d.ts +140 -0
  76. package/dist/in-store/edit/placement-core.d.ts.map +1 -0
  77. package/dist/in-store/edit/placement-core.js +317 -0
  78. package/dist/in-store/edit/placement-core.js.map +1 -0
  79. package/dist/in-store/edit/polygon-clip.d.ts +58 -0
  80. package/dist/in-store/edit/polygon-clip.d.ts.map +1 -0
  81. package/dist/in-store/edit/polygon-clip.js +153 -0
  82. package/dist/in-store/edit/polygon-clip.js.map +1 -0
  83. package/dist/in-store/edit/read-profile.d.ts +6 -0
  84. package/dist/in-store/edit/read-profile.d.ts.map +1 -0
  85. package/dist/in-store/edit/read-profile.js +95 -0
  86. package/dist/in-store/edit/read-profile.js.map +1 -0
  87. package/dist/in-store/edit/slab-edit-frame.d.ts +40 -0
  88. package/dist/in-store/edit/slab-edit-frame.d.ts.map +1 -0
  89. package/dist/in-store/edit/slab-edit-frame.js +146 -0
  90. package/dist/in-store/edit/slab-edit-frame.js.map +1 -0
  91. package/dist/in-store/edit/slab-edit.d.ts +112 -0
  92. package/dist/in-store/edit/slab-edit.d.ts.map +1 -0
  93. package/dist/in-store/edit/slab-edit.js +275 -0
  94. package/dist/in-store/edit/slab-edit.js.map +1 -0
  95. package/dist/in-store/edit/slab-opening-carry.d.ts +10 -0
  96. package/dist/in-store/edit/slab-opening-carry.d.ts.map +1 -0
  97. package/dist/in-store/edit/slab-opening-carry.js +65 -0
  98. package/dist/in-store/edit/slab-opening-carry.js.map +1 -0
  99. package/dist/in-store/edit/split-guid.d.ts +29 -0
  100. package/dist/in-store/edit/split-guid.d.ts.map +1 -0
  101. package/dist/in-store/edit/split-guid.js +64 -0
  102. package/dist/in-store/edit/split-guid.js.map +1 -0
  103. package/dist/in-store/edit/split-target.d.ts +90 -0
  104. package/dist/in-store/edit/split-target.d.ts.map +1 -0
  105. package/dist/in-store/edit/split-target.js +116 -0
  106. package/dist/in-store/edit/split-target.js.map +1 -0
  107. package/dist/in-store/edit/target.d.ts +8 -0
  108. package/dist/in-store/edit/target.d.ts.map +1 -0
  109. package/dist/in-store/edit/target.js +5 -0
  110. package/dist/in-store/edit/target.js.map +1 -0
  111. package/dist/in-store/edit/trim-extend-geometry.d.ts +99 -0
  112. package/dist/in-store/edit/trim-extend-geometry.d.ts.map +1 -0
  113. package/dist/in-store/edit/trim-extend-geometry.js +105 -0
  114. package/dist/in-store/edit/trim-extend-geometry.js.map +1 -0
  115. package/dist/in-store/edit/wall-axis-edit.d.ts +16 -0
  116. package/dist/in-store/edit/wall-axis-edit.d.ts.map +1 -0
  117. package/dist/in-store/edit/wall-axis-edit.js +40 -0
  118. package/dist/in-store/edit/wall-axis-edit.js.map +1 -0
  119. package/dist/in-store/edit/wall-edit.d.ts +157 -0
  120. package/dist/in-store/edit/wall-edit.d.ts.map +1 -0
  121. package/dist/in-store/edit/wall-edit.js +276 -0
  122. package/dist/in-store/edit/wall-edit.js.map +1 -0
  123. package/dist/in-store/edit/wall-hosted-cuts.d.ts +35 -0
  124. package/dist/in-store/edit/wall-hosted-cuts.d.ts.map +1 -0
  125. package/dist/in-store/edit/wall-hosted-cuts.js +27 -0
  126. package/dist/in-store/edit/wall-hosted-cuts.js.map +1 -0
  127. package/dist/in-store/edit/wall-opening-reassign.d.ts +18 -0
  128. package/dist/in-store/edit/wall-opening-reassign.d.ts.map +1 -0
  129. package/dist/in-store/edit/wall-opening-reassign.js +50 -0
  130. package/dist/in-store/edit/wall-opening-reassign.js.map +1 -0
  131. package/dist/in-store/element-align.d.ts +13 -0
  132. package/dist/in-store/element-align.d.ts.map +1 -0
  133. package/dist/in-store/element-align.js +90 -0
  134. package/dist/in-store/element-align.js.map +1 -0
  135. package/dist/in-store/element-replacement.d.ts +26 -0
  136. package/dist/in-store/element-replacement.d.ts.map +1 -0
  137. package/dist/in-store/element-replacement.js +68 -0
  138. package/dist/in-store/element-replacement.js.map +1 -0
  139. package/dist/in-store/element-size-edit.d.ts +40 -0
  140. package/dist/in-store/element-size-edit.d.ts.map +1 -0
  141. package/dist/in-store/element-size-edit.js +103 -0
  142. package/dist/in-store/element-size-edit.js.map +1 -0
  143. package/dist/in-store/element-split-axis.d.ts +6 -0
  144. package/dist/in-store/element-split-axis.d.ts.map +1 -0
  145. package/dist/in-store/element-split-axis.js +87 -0
  146. package/dist/in-store/element-split-axis.js.map +1 -0
  147. package/dist/in-store/element-split-joined.d.ts +13 -0
  148. package/dist/in-store/element-split-joined.d.ts.map +1 -0
  149. package/dist/in-store/element-split-joined.js +74 -0
  150. package/dist/in-store/element-split-joined.js.map +1 -0
  151. package/dist/in-store/element-split-placement.d.ts +19 -0
  152. package/dist/in-store/element-split-placement.d.ts.map +1 -0
  153. package/dist/in-store/element-split-placement.js +48 -0
  154. package/dist/in-store/element-split-placement.js.map +1 -0
  155. package/dist/in-store/element-split-slab.d.ts +19 -0
  156. package/dist/in-store/element-split-slab.d.ts.map +1 -0
  157. package/dist/in-store/element-split-slab.js +86 -0
  158. package/dist/in-store/element-split-slab.js.map +1 -0
  159. package/dist/in-store/element-split.d.ts +49 -0
  160. package/dist/in-store/element-split.d.ts.map +1 -0
  161. package/dist/in-store/element-split.js +52 -0
  162. package/dist/in-store/element-split.js.map +1 -0
  163. package/dist/in-store/element-transform-edit.d.ts +33 -0
  164. package/dist/in-store/element-transform-edit.d.ts.map +1 -0
  165. package/dist/in-store/element-transform-edit.js +97 -0
  166. package/dist/in-store/element-transform-edit.js.map +1 -0
  167. package/dist/in-store/element-transform-frames.d.ts +58 -0
  168. package/dist/in-store/element-transform-frames.d.ts.map +1 -0
  169. package/dist/in-store/element-transform-frames.js +110 -0
  170. package/dist/in-store/element-transform-frames.js.map +1 -0
  171. package/dist/in-store/element-transform-joins.d.ts +4 -0
  172. package/dist/in-store/element-transform-joins.d.ts.map +1 -0
  173. package/dist/in-store/element-transform-joins.js +62 -0
  174. package/dist/in-store/element-transform-joins.js.map +1 -0
  175. package/dist/in-store/element-transform-plan.d.ts +38 -0
  176. package/dist/in-store/element-transform-plan.d.ts.map +1 -0
  177. package/dist/in-store/element-transform-plan.js +115 -0
  178. package/dist/in-store/element-transform-plan.js.map +1 -0
  179. package/dist/in-store/element-trim-extend.d.ts +25 -0
  180. package/dist/in-store/element-trim-extend.d.ts.map +1 -0
  181. package/dist/in-store/element-trim-extend.js +97 -0
  182. package/dist/in-store/element-trim-extend.js.map +1 -0
  183. package/dist/in-store/extract-grids.d.ts +36 -0
  184. package/dist/in-store/extract-grids.d.ts.map +1 -0
  185. package/dist/in-store/extract-grids.js +220 -0
  186. package/dist/in-store/extract-grids.js.map +1 -0
  187. package/dist/in-store/extract-walls.d.ts +12 -23
  188. package/dist/in-store/extract-walls.d.ts.map +1 -1
  189. package/dist/in-store/extract-walls.js +6 -69
  190. package/dist/in-store/extract-walls.js.map +1 -1
  191. package/dist/in-store/generate-spaces.d.ts +1 -1
  192. package/dist/in-store/grid-column.d.ts +23 -0
  193. package/dist/in-store/grid-column.d.ts.map +1 -0
  194. package/dist/in-store/grid-column.js +73 -0
  195. package/dist/in-store/grid-column.js.map +1 -0
  196. package/dist/in-store/grid-intersection-read.d.ts +10 -0
  197. package/dist/in-store/grid-intersection-read.d.ts.map +1 -0
  198. package/dist/in-store/grid-intersection-read.js +45 -0
  199. package/dist/in-store/grid-intersection-read.js.map +1 -0
  200. package/dist/in-store/grid.d.ts +124 -0
  201. package/dist/in-store/grid.d.ts.map +1 -0
  202. package/dist/in-store/grid.js +204 -0
  203. package/dist/in-store/grid.js.map +1 -0
  204. package/dist/in-store/group-evidence.d.ts +49 -0
  205. package/dist/in-store/group-evidence.d.ts.map +1 -0
  206. package/dist/in-store/group-evidence.js +111 -0
  207. package/dist/in-store/group-evidence.js.map +1 -0
  208. package/dist/in-store/group-graph.d.ts +51 -0
  209. package/dist/in-store/group-graph.d.ts.map +1 -0
  210. package/dist/in-store/group-graph.js +213 -0
  211. package/dist/in-store/group-graph.js.map +1 -0
  212. package/dist/in-store/group.d.ts +34 -0
  213. package/dist/in-store/group.d.ts.map +1 -0
  214. package/dist/in-store/group.js +181 -0
  215. package/dist/in-store/group.js.map +1 -0
  216. package/dist/in-store/host-geometry-frame.d.ts +48 -0
  217. package/dist/in-store/host-geometry-frame.d.ts.map +1 -0
  218. package/dist/in-store/host-geometry-frame.js +190 -0
  219. package/dist/in-store/host-geometry-frame.js.map +1 -0
  220. package/dist/in-store/hosted-element-edit.d.ts +29 -0
  221. package/dist/in-store/hosted-element-edit.d.ts.map +1 -0
  222. package/dist/in-store/hosted-element-edit.js +120 -0
  223. package/dist/in-store/hosted-element-edit.js.map +1 -0
  224. package/dist/in-store/hosted-element.d.ts +41 -0
  225. package/dist/in-store/hosted-element.d.ts.map +1 -0
  226. package/dist/in-store/hosted-element.js +124 -0
  227. package/dist/in-store/hosted-element.js.map +1 -0
  228. package/dist/in-store/hosted-fill-read.d.ts +56 -0
  229. package/dist/in-store/hosted-fill-read.d.ts.map +1 -0
  230. package/dist/in-store/hosted-fill-read.js +197 -0
  231. package/dist/in-store/hosted-fill-read.js.map +1 -0
  232. package/dist/in-store/hosted-global-id.d.ts +8 -0
  233. package/dist/in-store/hosted-global-id.d.ts.map +1 -0
  234. package/dist/in-store/hosted-global-id.js +53 -0
  235. package/dist/in-store/hosted-global-id.js.map +1 -0
  236. package/dist/in-store/hosted-placement-edit.d.ts +30 -0
  237. package/dist/in-store/hosted-placement-edit.d.ts.map +1 -0
  238. package/dist/in-store/hosted-placement-edit.js +123 -0
  239. package/dist/in-store/hosted-placement-edit.js.map +1 -0
  240. package/dist/in-store/hosted-scale-chain.d.ts +12 -0
  241. package/dist/in-store/hosted-scale-chain.d.ts.map +1 -0
  242. package/dist/in-store/hosted-scale-chain.js +74 -0
  243. package/dist/in-store/hosted-scale-chain.js.map +1 -0
  244. package/dist/in-store/hosted-shape-edit.d.ts +9 -0
  245. package/dist/in-store/hosted-shape-edit.d.ts.map +1 -0
  246. package/dist/in-store/hosted-shape-edit.js +79 -0
  247. package/dist/in-store/hosted-shape-edit.js.map +1 -0
  248. package/dist/in-store/index.d.ts +66 -0
  249. package/dist/in-store/index.d.ts.map +1 -0
  250. package/dist/in-store/index.js +71 -0
  251. package/dist/in-store/index.js.map +1 -0
  252. package/dist/in-store/linear-profile-frame.d.ts +10 -0
  253. package/dist/in-store/linear-profile-frame.d.ts.map +1 -0
  254. package/dist/in-store/linear-profile-frame.js +17 -0
  255. package/dist/in-store/linear-profile-frame.js.map +1 -0
  256. package/dist/in-store/material.d.ts.map +1 -1
  257. package/dist/in-store/material.js +17 -6
  258. package/dist/in-store/material.js.map +1 -1
  259. package/dist/in-store/member.d.ts +8 -2
  260. package/dist/in-store/member.d.ts.map +1 -1
  261. package/dist/in-store/member.js +15 -21
  262. package/dist/in-store/member.js.map +1 -1
  263. package/dist/in-store/ordinary-element.d.ts +47 -0
  264. package/dist/in-store/ordinary-element.d.ts.map +1 -0
  265. package/dist/in-store/ordinary-element.js +38 -0
  266. package/dist/in-store/ordinary-element.js.map +1 -0
  267. package/dist/in-store/placement-frame.d.ts +15 -5
  268. package/dist/in-store/placement-frame.d.ts.map +1 -1
  269. package/dist/in-store/placement-frame.js +25 -36
  270. package/dist/in-store/placement-frame.js.map +1 -1
  271. package/dist/in-store/profile.d.ts +141 -0
  272. package/dist/in-store/profile.d.ts.map +1 -0
  273. package/dist/in-store/profile.js +174 -0
  274. package/dist/in-store/profile.js.map +1 -0
  275. package/dist/in-store/railing.d.ts +65 -0
  276. package/dist/in-store/railing.d.ts.map +1 -0
  277. package/dist/in-store/railing.js +112 -0
  278. package/dist/in-store/railing.js.map +1 -0
  279. package/dist/in-store/rel-connects-path.d.ts +43 -0
  280. package/dist/in-store/rel-connects-path.d.ts.map +1 -0
  281. package/dist/in-store/rel-connects-path.js +65 -0
  282. package/dist/in-store/rel-connects-path.js.map +1 -0
  283. package/dist/in-store/resolve-anchor.d.ts +3 -2
  284. package/dist/in-store/resolve-anchor.d.ts.map +1 -1
  285. package/dist/in-store/resolve-anchor.js +7 -5
  286. package/dist/in-store/resolve-anchor.js.map +1 -1
  287. package/dist/in-store/resolve-host.d.ts +12 -1
  288. package/dist/in-store/resolve-host.d.ts.map +1 -1
  289. package/dist/in-store/resolve-host.js +169 -85
  290. package/dist/in-store/resolve-host.js.map +1 -1
  291. package/dist/in-store/resolve-relations.d.ts +3 -1
  292. package/dist/in-store/resolve-relations.d.ts.map +1 -1
  293. package/dist/in-store/resolve-relations.js +8 -3
  294. package/dist/in-store/resolve-relations.js.map +1 -1
  295. package/dist/in-store/resolve-source.d.ts.map +1 -1
  296. package/dist/in-store/resolve-source.js +39 -59
  297. package/dist/in-store/resolve-source.js.map +1 -1
  298. package/dist/in-store/room-candidates.d.ts +58 -0
  299. package/dist/in-store/room-candidates.d.ts.map +1 -0
  300. package/dist/in-store/room-candidates.js +135 -0
  301. package/dist/in-store/room-candidates.js.map +1 -0
  302. package/dist/in-store/room-creation-plan.d.ts +16 -0
  303. package/dist/in-store/room-creation-plan.d.ts.map +1 -0
  304. package/dist/in-store/room-creation-plan.js +28 -0
  305. package/dist/in-store/room-creation-plan.js.map +1 -0
  306. package/dist/in-store/room-floor-height.d.ts +24 -0
  307. package/dist/in-store/room-floor-height.d.ts.map +1 -0
  308. package/dist/in-store/room-floor-height.js +32 -0
  309. package/dist/in-store/room-floor-height.js.map +1 -0
  310. package/dist/in-store/room-footprint-native.d.ts +19 -0
  311. package/dist/in-store/room-footprint-native.d.ts.map +1 -0
  312. package/dist/in-store/room-footprint-native.js +117 -0
  313. package/dist/in-store/room-footprint-native.js.map +1 -0
  314. package/dist/in-store/room-layout-cache.d.ts +23 -0
  315. package/dist/in-store/room-layout-cache.d.ts.map +1 -0
  316. package/dist/in-store/room-layout-cache.js +84 -0
  317. package/dist/in-store/room-layout-cache.js.map +1 -0
  318. package/dist/in-store/room-layout-core.d.ts +68 -0
  319. package/dist/in-store/room-layout-core.d.ts.map +1 -0
  320. package/dist/in-store/room-layout-core.js +153 -0
  321. package/dist/in-store/room-layout-core.js.map +1 -0
  322. package/dist/in-store/room-population.d.ts +5 -0
  323. package/dist/in-store/room-population.d.ts.map +1 -0
  324. package/dist/in-store/room-population.js +28 -0
  325. package/dist/in-store/room-population.js.map +1 -0
  326. package/dist/in-store/room-space-meshes.d.ts +15 -0
  327. package/dist/in-store/room-space-meshes.d.ts.map +1 -0
  328. package/dist/in-store/room-space-meshes.js +38 -0
  329. package/dist/in-store/room-space-meshes.js.map +1 -0
  330. package/dist/in-store/room-store.d.ts +55 -0
  331. package/dist/in-store/room-store.d.ts.map +1 -0
  332. package/dist/in-store/room-store.js +173 -0
  333. package/dist/in-store/room-store.js.map +1 -0
  334. package/dist/in-store/room-storey-elevation.d.ts +5 -0
  335. package/dist/in-store/room-storey-elevation.d.ts.map +1 -0
  336. package/dist/in-store/room-storey-elevation.js +42 -0
  337. package/dist/in-store/room-storey-elevation.js.map +1 -0
  338. package/dist/in-store/room-storey-frame.d.ts +47 -0
  339. package/dist/in-store/room-storey-frame.d.ts.map +1 -0
  340. package/dist/in-store/room-storey-frame.js +48 -0
  341. package/dist/in-store/room-storey-frame.js.map +1 -0
  342. package/dist/in-store/room-wall-rects.d.ts +117 -0
  343. package/dist/in-store/room-wall-rects.d.ts.map +1 -0
  344. package/dist/in-store/room-wall-rects.js +157 -0
  345. package/dist/in-store/room-wall-rects.js.map +1 -0
  346. package/dist/in-store/schema-attributes.d.ts +8 -3
  347. package/dist/in-store/schema-attributes.d.ts.map +1 -1
  348. package/dist/in-store/schema-attributes.js +18 -9
  349. package/dist/in-store/schema-attributes.js.map +1 -1
  350. package/dist/in-store/slab.d.ts.map +1 -1
  351. package/dist/in-store/slab.js +1 -4
  352. package/dist/in-store/slab.js.map +1 -1
  353. package/dist/in-store/space-footprints.d.ts +55 -0
  354. package/dist/in-store/space-footprints.d.ts.map +1 -0
  355. package/dist/in-store/space-footprints.js +260 -0
  356. package/dist/in-store/space-footprints.js.map +1 -0
  357. package/dist/in-store/space.d.ts.map +1 -1
  358. package/dist/in-store/space.js +15 -3
  359. package/dist/in-store/space.js.map +1 -1
  360. package/dist/in-store/spatial-children.d.ts +1 -1
  361. package/dist/in-store/spatial-children.js +1 -1
  362. package/dist/in-store/stair-edit.d.ts +24 -0
  363. package/dist/in-store/stair-edit.d.ts.map +1 -0
  364. package/dist/in-store/stair-edit.js +190 -0
  365. package/dist/in-store/stair-edit.js.map +1 -0
  366. package/dist/in-store/stair-removal.d.ts +17 -0
  367. package/dist/in-store/stair-removal.d.ts.map +1 -0
  368. package/dist/in-store/stair-removal.js +134 -0
  369. package/dist/in-store/stair-removal.js.map +1 -0
  370. package/dist/in-store/stair.d.ts +58 -0
  371. package/dist/in-store/stair.d.ts.map +1 -0
  372. package/dist/in-store/stair.js +156 -0
  373. package/dist/in-store/stair.js.map +1 -0
  374. package/dist/in-store/storey-plan-frame.d.ts +2 -1
  375. package/dist/in-store/storey-plan-frame.d.ts.map +1 -1
  376. package/dist/in-store/storey-plan-frame.js +20 -11
  377. package/dist/in-store/storey-plan-frame.js.map +1 -1
  378. package/dist/in-store/storey-reassignment-plan.d.ts +53 -0
  379. package/dist/in-store/storey-reassignment-plan.d.ts.map +1 -0
  380. package/dist/in-store/storey-reassignment-plan.js +237 -0
  381. package/dist/in-store/storey-reassignment-plan.js.map +1 -0
  382. package/dist/in-store/storey-reassignment.d.ts +8 -0
  383. package/dist/in-store/storey-reassignment.d.ts.map +1 -0
  384. package/dist/in-store/storey-reassignment.js +52 -0
  385. package/dist/in-store/storey-reassignment.js.map +1 -0
  386. package/dist/in-store/trim-extend-plan.d.ts +27 -0
  387. package/dist/in-store/trim-extend-plan.d.ts.map +1 -0
  388. package/dist/in-store/trim-extend-plan.js +49 -0
  389. package/dist/in-store/trim-extend-plan.js.map +1 -0
  390. package/dist/in-store/wall-join-apply.d.ts +74 -0
  391. package/dist/in-store/wall-join-apply.d.ts.map +1 -0
  392. package/dist/in-store/wall-join-apply.js +137 -0
  393. package/dist/in-store/wall-join-apply.js.map +1 -0
  394. package/dist/in-store/wall-join-edit.d.ts +53 -0
  395. package/dist/in-store/wall-join-edit.d.ts.map +1 -0
  396. package/dist/in-store/wall-join-edit.js +251 -0
  397. package/dist/in-store/wall-join-edit.js.map +1 -0
  398. package/dist/in-store/wall-join-read.d.ts +60 -0
  399. package/dist/in-store/wall-join-read.d.ts.map +1 -0
  400. package/dist/in-store/wall-join-read.js +230 -0
  401. package/dist/in-store/wall-join-read.js.map +1 -0
  402. package/dist/in-store/wall-join.d.ts +122 -0
  403. package/dist/in-store/wall-join.d.ts.map +1 -0
  404. package/dist/in-store/wall-join.js +231 -0
  405. package/dist/in-store/wall-join.js.map +1 -0
  406. package/dist/in-store/wall-opening-fit.d.ts +11 -0
  407. package/dist/in-store/wall-opening-fit.d.ts.map +1 -0
  408. package/dist/in-store/wall-opening-fit.js +27 -0
  409. package/dist/in-store/wall-opening-fit.js.map +1 -0
  410. package/dist/in-store/wall-section-edit.d.ts +16 -0
  411. package/dist/in-store/wall-section-edit.d.ts.map +1 -0
  412. package/dist/in-store/wall-section-edit.js +75 -0
  413. package/dist/in-store/wall-section-edit.js.map +1 -0
  414. package/dist/in-store/wall-size-edit.d.ts +29 -0
  415. package/dist/in-store/wall-size-edit.d.ts.map +1 -0
  416. package/dist/in-store/wall-size-edit.js +65 -0
  417. package/dist/in-store/wall-size-edit.js.map +1 -0
  418. package/dist/in-store/wall.d.ts +32 -0
  419. package/dist/in-store/wall.d.ts.map +1 -1
  420. package/dist/in-store/wall.js +77 -13
  421. package/dist/in-store/wall.js.map +1 -1
  422. package/dist/index.d.ts +25 -38
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +25 -40
  425. package/dist/index.js.map +1 -1
  426. package/package.json +9 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-transform-joins.js","sourceRoot":"","sources":["../../src/in-store/element-transform-joins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { IfcDataStore } from '@ifc-lite/parser';
2
+ import type { MutablePropertyView } from '@ifc-lite/mutations';
3
+ import { type PlanFrame } from './element-transform-frames.js';
4
+ type Vec2 = [number, number];
5
+ export interface TransformRoot {
6
+ readonly expressId: number;
7
+ readonly storeyId: number;
8
+ /** The parent placement's frame in the storey frame (the identity under the storey). */
9
+ readonly parent: PlanFrame;
10
+ /** The element's placement origin in the storey frame, metres. */
11
+ readonly origin: Vec2;
12
+ /** Its own placement is upright (Z up), so it can be turned about Z. */
13
+ readonly upright: boolean;
14
+ }
15
+ export interface TransformRefusal {
16
+ readonly expressId: number;
17
+ readonly reason: 'noStorey' | 'noPlacement' | 'offStorey';
18
+ }
19
+ export interface TransformPlan {
20
+ readonly roots: readonly TransformRoot[];
21
+ /** Moved with a root through their placement chain; re-meshed, never written. */
22
+ readonly carried: readonly number[];
23
+ readonly refused: readonly TransformRefusal[];
24
+ }
25
+ export interface TransformPlanInput {
26
+ readonly dataStore: IfcDataStore;
27
+ readonly view: MutablePropertyView;
28
+ /** The selected elements (model-local express ids). */
29
+ readonly selected: readonly number[];
30
+ /** The storey an element sits on, or null. */
31
+ storeyOf(expressId: number): number | null;
32
+ }
33
+ export declare function planElementTransform(input: TransformPlanInput): TransformPlan;
34
+ /** Current native placement, independent of which other selected roots carry it.
35
+ * Evidence can pin a carried member without treating it as a separately moved root. */
36
+ export declare function readElementTransformPlacement(input: Pick<TransformPlanInput, 'dataStore' | 'view'>, expressId: number, storeyId: number | null): TransformRoot | TransformRefusal;
37
+ export {};
38
+ //# sourceMappingURL=element-transform-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-transform-plan.d.ts","sourceRoot":"","sources":["../../src/in-store/element-transform-plan.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAEiB,KAAK,SAAS,EACrC,MAAM,+BAA+B,CAAC;AAEvC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;CAC3D;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,uDAAuD;IACvD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5C;AAuCD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CA4B7E;AAED;uFACuF;AACvF,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,GAAG,MAAM,CAAC,EACrD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,aAAa,GAAG,gBAAgB,CAclC"}
@@ -0,0 +1,115 @@
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
+ * What a move or a turn of a selection writes (charter #6232, C2), worked
6
+ * out before anything is written.
7
+ *
8
+ * The moved set is the selection plus what it hosts: a host's openings and
9
+ * the fillings in them, a filling's opening (a window moves with the void it
10
+ * fills), through the same relationship walk the re-mesher uses
11
+ * (`expandAffectedSet`, overlay relationships included).
12
+ *
13
+ * Only the ROOTS of that set are written. An element whose placement hangs,
14
+ * however many hops up, from another moved element's placement already moves
15
+ * with it — an opening placed relative to its wall, a door relative to its
16
+ * opening — and writing it too would move it twice. A filling placed
17
+ * relative to the storey instead is a root and is written like the host.
18
+ *
19
+ * Each root carries its parent placement's frame in its storey's frame, and
20
+ * its own origin there, so a storey-frame move or turn can be written in the
21
+ * frame `translateEntity` / `rotateEntity` work in. A root whose chain does
22
+ * not reach its storey's placement is refused, never moved by a guess.
23
+ */
24
+ import { IfcTypeEnum, IfcTypeEnumFromString } from '@ifc-lite/data';
25
+ import { expandAffectedSet } from '@ifc-lite/export';
26
+ import { IDENTITY_FRAME, applyFrame, frameInStorey, objectPlacementOf, placementAncestors, placementOrigin, uprightFrame, } from './element-transform-frames.js';
27
+ /** The effective IFC class (UPPERCASE): retypes, overlay creations, then the source index — which also knows non-products. */
28
+ function typeOf(input, id) {
29
+ const { dataStore, view } = input;
30
+ const edited = view.getEntityTypeMutation(id)?.newType ?? view.getNewEntity(id)?.type;
31
+ if (edited)
32
+ return edited.toUpperCase();
33
+ // @raw-entity-enumeration-ok point lookup of one id's class; retypes and overlay creations are answered from the view above
34
+ const source = dataStore.entityIndex.byId.get(id)?.type;
35
+ return (source ?? dataStore.entities.getTypeName(id) ?? '').toUpperCase();
36
+ }
37
+ const isOpening = (type) => IfcTypeEnumFromString(type) === IfcTypeEnum.IfcOpeningElement;
38
+ /**
39
+ * The moved set: each selected element and what moves with it, mapped to the
40
+ * storey whose frame it is written in (the selected element's).
41
+ */
42
+ function movedSet(input) {
43
+ const moved = new Map();
44
+ for (const id of input.selected)
45
+ moved.set(id, input.storeyOf(id));
46
+ for (const id of input.selected) {
47
+ // A bare opening moves on its own: expanding it would take its host along.
48
+ if (isOpening(typeOf(input, id)))
49
+ continue;
50
+ for (const dependent of expandAffectedSet(input.dataStore, input.view, [id], 'hostsChanged')) {
51
+ // The walk also returns what is not placed (a material relationship the
52
+ // parser has no type name for): only placed products move.
53
+ if (!moved.has(dependent) && placementOf(input, dependent) !== null)
54
+ moved.set(dependent, moved.get(id) ?? null);
55
+ }
56
+ }
57
+ return moved;
58
+ }
59
+ /** A product's `ObjectPlacement` when it is an `IfcLocalPlacement`, else null. */
60
+ function placementOf(input, productId) {
61
+ const placement = objectPlacementOf(input, productId);
62
+ return placement !== null && typeOf(input, placement) === 'IFCLOCALPLACEMENT' ? placement : null;
63
+ }
64
+ export function planElementTransform(input) {
65
+ const reader = { dataStore: input.dataStore, view: input.view };
66
+ const moved = movedSet(input);
67
+ const placements = new Map();
68
+ for (const id of moved.keys()) {
69
+ const placement = placementOf(input, id);
70
+ if (placement !== null)
71
+ placements.set(placement, id);
72
+ }
73
+ const roots = [];
74
+ const carried = [];
75
+ const refused = [];
76
+ for (const [expressId, storeyId] of moved) {
77
+ const placement = placementOf(input, expressId);
78
+ if (placement === null) {
79
+ refused.push({ expressId, reason: 'noPlacement' });
80
+ continue;
81
+ }
82
+ const ancestors = placementAncestors(reader, placement);
83
+ if (ancestors.some((p) => placements.has(p))) {
84
+ carried.push(expressId);
85
+ continue;
86
+ }
87
+ const current = readElementTransformPlacement(input, expressId, storeyId);
88
+ if ('reason' in current)
89
+ refused.push(current);
90
+ else
91
+ roots.push(current);
92
+ }
93
+ return { roots, carried, refused };
94
+ }
95
+ /** Current native placement, independent of which other selected roots carry it.
96
+ * Evidence can pin a carried member without treating it as a separately moved root. */
97
+ export function readElementTransformPlacement(input, expressId, storeyId) {
98
+ const reader = input;
99
+ const placement = placementOf(input, expressId);
100
+ if (placement === null)
101
+ return { expressId, reason: 'noPlacement' };
102
+ if (storeyId === null)
103
+ return { expressId, reason: 'noStorey' };
104
+ const ancestors = placementAncestors(reader, placement);
105
+ const storeyPlacement = objectPlacementOf(reader, storeyId);
106
+ const parentId = ancestors[0] ?? null;
107
+ const parent = storeyPlacement === null || parentId === null
108
+ ? null
109
+ : parentId === storeyPlacement ? IDENTITY_FRAME : frameInStorey(reader, parentId, storeyPlacement);
110
+ const local = placementOrigin(reader, placement);
111
+ if (!parent || !local)
112
+ return { expressId, reason: 'offStorey' };
113
+ return { expressId, storeyId, parent, origin: applyFrame(parent, local), upright: uprightFrame(reader, placement) !== null };
114
+ }
115
+ //# sourceMappingURL=element-transform-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-transform-plan.js","sourceRoot":"","sources":["../../src/in-store/element-transform-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { IfcDataStore } from '@ifc-lite/parser';
2
+ import type { StoreEditor } from '@ifc-lite/mutations';
3
+ import type { ReachBoundary, ReachMode } from './edit/trim-extend-geometry.js';
4
+ export interface ElementTrimExtendParams {
5
+ readonly mode: ReachMode;
6
+ /** Storey-local plan click selecting which end is removed or extended. */
7
+ readonly click: [number, number];
8
+ /** Wall boundary is resolved live and joined; explicit lines cover slab
9
+ * edges and snap guides in the existing command's storey frame. */
10
+ readonly boundary: {
11
+ readonly wallId: number;
12
+ } | ReachBoundary;
13
+ }
14
+ export interface ElementTrimExtendResult {
15
+ readonly expressId: number;
16
+ readonly walls: number[];
17
+ readonly joined: boolean;
18
+ readonly op: ReachMode;
19
+ readonly end: 'start' | 'end';
20
+ readonly length: number;
21
+ }
22
+ /** #6232 D5: live planning, resize, hosted refit and boundary join commit as
23
+ * one atomic edit. No UI-only write path can diverge from this operation. */
24
+ export declare function trimExtendElementInStore(store: IfcDataStore, editor: StoreEditor, id: number, params: ElementTrimExtendParams): ElementTrimExtendResult;
25
+ //# sourceMappingURL=element-trim-extend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-trim-extend.d.ts","sourceRoot":"","sources":["../../src/in-store/element-trim-extend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAWvD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;uEACmE;IACnE,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,aAAa,CAAC;CAChE;AACD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;6EAC6E;AAC7E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,uBAAuB,CAgEvJ"}
@@ -0,0 +1,97 @@
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 { editOwnershipRefusal } from '@ifc-lite/export';
5
+ import { toNativeLength } from './anchor.js';
6
+ import { readWallJoinTarget } from './wall-join-read.js';
7
+ import { joinWallsInStore, resolveWallJoinAnchor } from './wall-join-edit.js';
8
+ import { reanchorHostedOpeningsInStore } from './hosted-placement-edit.js';
9
+ import { resizeWallInStore } from './wall-size-edit.js';
10
+ import { resolveLinearElementChain } from './edit/linear-element-edit.js';
11
+ import { getModelLengthUnitScale } from './edit/length-unit-scale.js';
12
+ import { effectiveStoreyId } from './edit/effective-storey.js';
13
+ import { readHostedCuts } from './edit/wall-hosted-cuts.js';
14
+ import { planTrimAxis } from './trim-extend-plan.js';
15
+ /** #6232 D5: live planning, resize, hosted refit and boundary join commit as
16
+ * one atomic edit. No UI-only write path can diverge from this operation. */
17
+ export function trimExtendElementInStore(store, editor, id, params) {
18
+ if (params.mode !== 'trim' && params.mode !== 'extend')
19
+ throw new Error('Trim/extend mode must be trim or extend');
20
+ if (params.click.length !== 2 || !params.click.every(Number.isFinite))
21
+ throw new Error('Trim/extend click must be finite');
22
+ return editor.runAtomic(draft => {
23
+ const view = draft.getMutationView(), scale = getModelLengthUnitScale(store);
24
+ const type = draft.getEntityType(id)?.toUpperCase();
25
+ const isWall = type === 'IFCWALL' || type === 'IFCWALLSTANDARDCASE';
26
+ if (!isWall && type !== 'IFCBEAM' && type !== 'IFCMEMBER')
27
+ throw new Error('Trim/extend requires a wall, beam or member');
28
+ const storeyId = effectiveStoreyId(store, view, id);
29
+ if (storeyId === undefined)
30
+ throw new Error('Trim/extend requires a live storey');
31
+ const read = isWall ? readWallJoinTarget(store, view, id, scale) : null;
32
+ const chain = isWall ? null : resolveLinearElementChain(store, view, draft, id, scale);
33
+ if ((isWall && !read) || (!isWall && !chain))
34
+ throw new Error('Trim/extend body cannot be read safely');
35
+ const axis = read ? (() => {
36
+ const { start, end } = read.wall, length = Math.hypot(end[0] - start[0], end[1] - start[1]);
37
+ return { p0: [start[0], start[1], read.location[2] * scale],
38
+ dir: [(end[0] - start[0]) / length, (end[1] - start[1]) / length, 0], length };
39
+ })() : { p0: chain.startCoordinates, dir: chain.axisDirection, length: chain.depth };
40
+ let boundary, boundaryWall = null;
41
+ if ('wallId' in params.boundary) {
42
+ if (isWall && (String(store.schemaVersion ?? 'IFC4').toUpperCase() === 'IFC5' || !store.source || store.source.byteLength === 0))
43
+ throw new Error('Wall joins are authored in IFC2X3, IFC4 and IFC4X3 models only');
44
+ const boundaryId = params.boundary.wallId;
45
+ if (boundaryId === id || effectiveStoreyId(store, view, boundaryId) !== storeyId)
46
+ throw new Error('Boundary wall must be distinct and in the same live storey');
47
+ const other = readWallJoinTarget(store, view, boundaryId, scale);
48
+ if (!other)
49
+ throw new Error('Boundary wall cannot be read safely');
50
+ boundaryWall = other.wall;
51
+ boundary = { a: other.wall.start, b: other.wall.end, tMin: 0, tMax: 1, reach: other.wall.thickness / 2 };
52
+ }
53
+ else {
54
+ boundary = params.boundary;
55
+ if (boundary.a.length !== 2 || boundary.b.length !== 2 || ![...boundary.a, ...boundary.b, boundary.reach].every(Number.isFinite)
56
+ || Number.isNaN(boundary.tMin) || Number.isNaN(boundary.tMax) || boundary.tMin > boundary.tMax || boundary.reach < 0)
57
+ throw new Error('Trim/extend boundary must be a valid finite plan line');
58
+ }
59
+ const hosted = read ? readHostedCuts(store, view, id) : null;
60
+ const plan = planTrimAxis({ kind: isWall ? 'wall' : 'beam', axis, wall: read }, boundary, params.mode, params.click, boundaryWall, hosted);
61
+ if (!plan.ok)
62
+ throw new Error(`Trim/extend refused: ${plan.reason}${plan.detail ? `: ${plan.detail}` : ''}`);
63
+ const walls = new Set([id]);
64
+ if (read) {
65
+ const result = resizeWallInStore({ dataStore: store, view, editor: draft }, id, plan.start, plan.stop);
66
+ if (!result.ok)
67
+ throw new Error(result.reason);
68
+ for (const wall of result.walls)
69
+ walls.add(wall);
70
+ const after = readWallJoinTarget(store, view, id, scale);
71
+ if (hosted.cuts.length > 0 && !after)
72
+ throw new Error('Changed wall body cannot be read safely');
73
+ if (after && hosted.cuts.length > 0) {
74
+ const [dx, dy] = axis.dir;
75
+ const mx = after.origin[0] - read.origin[0], my = after.origin[1] - read.origin[1];
76
+ const along = mx * dx + my * dy, across = -mx * dy + my * dx;
77
+ if (Math.abs(along) > 1e-9 || Math.abs(across) > 1e-9)
78
+ reanchorHostedOpeningsInStore(store, draft, id, [toNativeLength({ lengthUnitScale: scale }, along), toNativeLength({ lengthUnitScale: scale }, across), 0]);
79
+ }
80
+ if ('wallId' in params.boundary) {
81
+ joinWallsInStore(draft, store, resolveWallJoinAnchor(store, view), params.boundary.wallId, id);
82
+ walls.add(params.boundary.wallId);
83
+ }
84
+ }
85
+ else {
86
+ const writtenIds = [chain.extrudedSolidId, ...(plan.end === 'start' ? [chain.startPointId] : [])];
87
+ const ownership = editOwnershipRefusal(store, view, writtenIds, new Set([id]));
88
+ if (ownership)
89
+ throw new Error(ownership);
90
+ draft.setPositionalAttribute(chain.extrudedSolidId, 3, toNativeLength({ lengthUnitScale: scale }, plan.length));
91
+ if (plan.end === 'start')
92
+ draft.setPositionalAttribute(chain.startPointId, 0, plan.start.map(v => toNativeLength({ lengthUnitScale: scale }, v)));
93
+ }
94
+ return { expressId: id, walls: [...walls], joined: isWall && 'wallId' in params.boundary, op: plan.op, end: plan.end, length: plan.length };
95
+ });
96
+ }
97
+ //# sourceMappingURL=element-trim-extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element-trim-extend.js","sourceRoot":"","sources":["../../src/in-store/element-trim-extend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type IfcDataStore } from '@ifc-lite/parser';
2
+ import type { Vec2 } from './auto-space-detect.js';
3
+ import { type OverlayWallReader } from './placement-frame.js';
4
+ export interface GridAxisSegment {
5
+ /** The IfcGrid this axis belongs to. */
6
+ gridId: number;
7
+ axisId: number;
8
+ /** The IfcGridAxis.AxisTag ('1', 'A', ...). */
9
+ AxisTag: string;
10
+ family: 'U' | 'V' | 'W';
11
+ /** Axis ends in storey-local metres. */
12
+ a: Vec2;
13
+ b: Vec2;
14
+ }
15
+ export interface StoreyGridAxes {
16
+ axes: GridAxisSegment[];
17
+ /** IfcGrid entities found. */
18
+ gridIds: number[];
19
+ /** Axes with unreadable placement frames or unsupported curves: not offered. */
20
+ skippedAxes: number;
21
+ }
22
+ type Reader = (id: number) => {
23
+ type?: string;
24
+ attributes: readonly unknown[];
25
+ } | null;
26
+ /** The two ends of a straight axis curve in the grid's own frame (raw units), or null. */
27
+ export declare function readAxisEnds(read: Reader, curveId: number): [Vec2, Vec2] | null;
28
+ /**
29
+ * The grid axes that apply to `storeyId`, in storey-local metres. Empty (never
30
+ * throwing) for a store without source bytes. An unplaced grid uses identity
31
+ * only when the readable storey also explicitly omits ObjectPlacement;
32
+ * otherwise its axes are counted in skippedAxes.
33
+ */
34
+ export declare function extractGridAxesForStorey(store: IfcDataStore, storeyId: number, overlay?: OverlayWallReader): StoreyGridAxes;
35
+ export {};
36
+ //# sourceMappingURL=extract-grids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-grids.d.ts","sourceRoot":"","sources":["../../src/in-store/extract-grids.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAGnD,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAQ9B,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACxB,wCAAwC;IACxC,CAAC,EAAE,IAAI,CAAC;IACR,CAAC,EAAE,IAAI,CAAC;CACT;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,MAAM,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC;AAuCvF,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,CAsD/E;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CA4EhB"}
@@ -0,0 +1,220 @@
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
+ * The design-grid axes visible on a storey, in the storey's own frame
6
+ * (metres): what a snap source needs to let walls, columns and curtain walls
7
+ * land on grid lines and grid intersections (#6232).
8
+ *
9
+ * An IfcGrid is contained in a storey, or (very often) in the building or site
10
+ * above it, so grids contained in any spatial ancestor of the storey count.
11
+ * Both file grids and grids authored this session (`addGridToStore`) are read
12
+ * through the same overlay-aware entity reader the wall extractor uses, so an
13
+ * axis edited or deleted this session reads as it now is.
14
+ *
15
+ * Each axis curve is read as a straight segment: a two-point IfcPolyline (the
16
+ * form `addGridToStore`, Revit and most exporters write), or an IfcTrimmedCurve
17
+ * over an IfcLine trimmed by points or by parameters (ArchiCAD). Other curves
18
+ * (arcs of a radial grid) are skipped and counted, never guessed at.
19
+ * `IfcGridAxis.SameSense` is ignored, as everywhere else the grid is read.
20
+ */
21
+ import { MutablePropertyView } from '@ifc-lite/mutations';
22
+ import { AnchorEntityReader } from './resolve-anchor.js';
23
+ import { EntityExtractor } from '@ifc-lite/parser';
24
+ import { safeLengthUnitScale } from './length-unit-scale.js';
25
+ import { num, pointOf } from './host-geometry-frame.js';
26
+ import { AXIS_EPS, applyFrame, frameInStoreyFrame, numericAttr, readEntity, storeyPlacementChain, } from './placement-frame.js';
27
+ import { authoredScalar, buildRelatingChildrenIndex, createOverlayLookup, effectiveMemberType, } from './spatial-children.js';
28
+ const refList = (value) => (Array.isArray(value)
29
+ ? value.map((v) => numericAttr(v)).filter((n) => n !== null)
30
+ : []);
31
+ /**
32
+ * A trim value: a parameter (`IFCPARAMETERVALUE(2.5)` parses to
33
+ * `['IFCPARAMETERVALUE', 2.5]`; an authored one is `{ typed }` or `{ real }`),
34
+ * or a reference to a cartesian point. A bare number is a reference here: the
35
+ * parser hands references over as numbers.
36
+ */
37
+ function readTrim(read, value) {
38
+ const items = Array.isArray(value) ? value : [value];
39
+ for (const item of items) {
40
+ if (Array.isArray(item)) {
41
+ const parameter = num(item[1]);
42
+ if (parameter !== null)
43
+ return { parameter };
44
+ }
45
+ if (item !== null && typeof item === 'object' && !Array.isArray(item)) {
46
+ const scalar = authoredScalar(item);
47
+ const parameter = num(scalar);
48
+ if (parameter !== null)
49
+ return { parameter };
50
+ }
51
+ const id = numericAttr(item);
52
+ const point = id === null ? null : pointAt(read, id);
53
+ if (point)
54
+ return { point };
55
+ }
56
+ return null;
57
+ }
58
+ function pointAt(read, id, type = 'IFCCARTESIANPOINT') {
59
+ const p = pointOf({ entity: (entityId) => {
60
+ const entity = read(entityId);
61
+ return entity?.type ? { type: entity.type, attributes: entity.attributes } : null;
62
+ } }, id, type, 2);
63
+ return p ? [p[0], p[1]] : null;
64
+ }
65
+ /** The two ends of a straight axis curve in the grid's own frame (raw units), or null. */
66
+ export function readAxisEnds(read, curveId) {
67
+ const curve = read(curveId);
68
+ const type = curve?.type?.toUpperCase();
69
+ if (!curve)
70
+ return null;
71
+ if (type === 'IFCPOLYLINE') {
72
+ const ids = refList(curve.attributes[0]);
73
+ if (ids.length < 2)
74
+ return null;
75
+ const a = pointAt(read, ids[0]);
76
+ const b = pointAt(read, ids[ids.length - 1]);
77
+ if (!a || !b)
78
+ return null;
79
+ if (ids.length > 2) {
80
+ const dx = b[0] - a[0], dy = b[1] - a[1];
81
+ const length = Math.hypot(dx, dy);
82
+ if (length <= AXIS_EPS)
83
+ return null;
84
+ for (const id of ids.slice(1, -1)) {
85
+ const point = pointAt(read, id);
86
+ if (!point)
87
+ return null;
88
+ const px = point[0] - a[0], py = point[1] - a[1];
89
+ const projection = px * dx + py * dy;
90
+ // A bent or backtracking curve extending beyond the endpoints is
91
+ // not this segment: never offer an invented diagonal snap target.
92
+ if (Math.abs(px * dy - py * dx) > AXIS_EPS * length
93
+ || projection < -AXIS_EPS * length
94
+ || projection > length * length + AXIS_EPS * length)
95
+ return null;
96
+ }
97
+ }
98
+ return [a, b];
99
+ }
100
+ if (type !== 'IFCTRIMMEDCURVE')
101
+ return null;
102
+ const basisId = numericAttr(curve.attributes[0]);
103
+ const basis = basisId === null ? null : read(basisId);
104
+ if (basis?.type?.toUpperCase() !== 'IFCLINE')
105
+ return null;
106
+ // Point trims still require a valid IfcLine basis; unreadable required
107
+ // attributes cannot turn an invalid curve into a straight snap target.
108
+ const originId = numericAttr(basis.attributes[0]);
109
+ const vectorId = numericAttr(basis.attributes[1]);
110
+ const origin = originId === null ? null : pointAt(read, originId);
111
+ const vector = vectorId === null ? null : read(vectorId);
112
+ if (vector?.type?.toUpperCase() !== 'IFCVECTOR')
113
+ return null;
114
+ const dirId = numericAttr(vector.attributes[0]);
115
+ const d = dirId === null ? null : pointAt(read, dirId, 'IFCDIRECTION');
116
+ if (!origin || !d)
117
+ return null;
118
+ const magnitude = num(authoredScalar(vector.attributes[1]));
119
+ const len = Math.hypot(d[0], d[1]);
120
+ if (magnitude === null || magnitude <= 0 || !Number.isFinite(len) || len === 0)
121
+ return null;
122
+ const trims = [readTrim(read, curve.attributes[1]), readTrim(read, curve.attributes[2])];
123
+ // Parameters use Pnt + t * normalized Orientation * Magnitude. Normalize
124
+ // before scaling so a tiny but nonzero direction remains readable.
125
+ const at = (t) => ('point' in t
126
+ ? t.point
127
+ : [origin[0] + t.parameter * (d[0] / len) * magnitude, origin[1] + t.parameter * (d[1] / len) * magnitude]);
128
+ if (!trims[0] || !trims[1])
129
+ return null;
130
+ const ends = [at(trims[0]), at(trims[1])];
131
+ return ends.every((point) => point.every(Number.isFinite)) ? ends : null;
132
+ }
133
+ /**
134
+ * The grid axes that apply to `storeyId`, in storey-local metres. Empty (never
135
+ * throwing) for a store without source bytes. An unplaced grid uses identity
136
+ * only when the readable storey also explicitly omits ObjectPlacement;
137
+ * otherwise its axes are counted in skippedAxes.
138
+ */
139
+ export function extractGridAxesForStorey(store, storeyId, overlay) {
140
+ const out = { axes: [], gridIds: [], skippedAxes: 0 };
141
+ if (!store.source)
142
+ return out;
143
+ const extractor = new EntityExtractor(store.source);
144
+ const lookup = createOverlayLookup(overlay);
145
+ // #7304: native grid evidence and binding share effective named/positional records.
146
+ const nativeView = overlay instanceof MutablePropertyView ? overlay : undefined;
147
+ const effective = new AnchorEntityReader(store, nativeView);
148
+ // The public structural OverlayWallReader also accepts lightweight callers
149
+ // without named-edit methods. Preserve that existing positional-only contract.
150
+ const read = overlay && !nativeView
151
+ ? id => readEntity(store, extractor, overlay, id)
152
+ : id => effective.entity(id);
153
+ const scale = store.source.byteLength > 0
154
+ ? safeLengthUnitScale(store.source, store.entityIndex, 'extractGridAxesForStorey') ?? 1
155
+ : 1;
156
+ const aggregated = buildRelatingChildrenIndex(store, extractor, lookup, 'IFCRELAGGREGATES', 4, 5);
157
+ const contained = buildRelatingChildrenIndex(store, extractor, lookup, 'IFCRELCONTAINEDINSPATIALSTRUCTURE', 5, 4);
158
+ const parentOf = new Map();
159
+ for (const [parent, children] of aggregated)
160
+ for (const child of children)
161
+ parentOf.set(child, parent);
162
+ // The storey and every spatial ancestor (building, site, project), storey first.
163
+ const hosts = [];
164
+ for (let id = storeyId; id !== undefined && !hosts.includes(id); id = parentOf.get(id))
165
+ hosts.push(id);
166
+ const gridIds = new Set();
167
+ for (const host of hosts) {
168
+ for (const member of [...(contained.get(host) ?? []), ...(aggregated.get(host) ?? [])]) {
169
+ if ((effectiveMemberType(store, lookup, member) ?? '').toUpperCase() === 'IFCGRID')
170
+ gridIds.add(member);
171
+ }
172
+ }
173
+ if (gridIds.size === 0)
174
+ return out;
175
+ const storeyChain = storeyPlacementChain(store, extractor, overlay, storeyId);
176
+ const storey = read(storeyId);
177
+ const storeyHasNoPlacement = storey?.type?.toUpperCase() === 'IFCBUILDINGSTOREY' && storey.attributes[5] === null;
178
+ for (const gridId of gridIds) {
179
+ const grid = read(gridId);
180
+ if (!grid)
181
+ continue;
182
+ out.gridIds.push(gridId);
183
+ const placementId = numericAttr(grid.attributes[5]);
184
+ // An absent product placement is identity only in an explicitly unplaced
185
+ // storey; neither unreadable records nor placed storeys establish that.
186
+ const frame = placementId === null
187
+ ? (grid.attributes[5] === null && storeyHasNoPlacement
188
+ ? { origin: [0, 0], axisX: [1, 0] } : null)
189
+ : frameInStoreyFrame(store, extractor, overlay, placementId, storeyChain);
190
+ const families = [['U', grid.attributes[7]], ['V', grid.attributes[8]], ['W', grid.attributes[9]]];
191
+ if (!frame) {
192
+ out.skippedAxes += families.reduce((count, [, list]) => count + refList(list).length, 0);
193
+ continue;
194
+ }
195
+ for (const [family, list] of families) {
196
+ for (const axisId of refList(list)) {
197
+ const axis = read(axisId);
198
+ const curveId = axis ? numericAttr(axis.attributes[1]) : null;
199
+ const ends = curveId === null ? null : readAxisEnds(read, curveId);
200
+ if (!axis || !ends) {
201
+ out.skippedAxes += 1;
202
+ continue;
203
+ }
204
+ const a = applyFrame(frame, ends[0]);
205
+ const b = applyFrame(frame, ends[1]);
206
+ if (Math.hypot(b[0] - a[0], b[1] - a[1]) <= AXIS_EPS) {
207
+ out.skippedAxes += 1;
208
+ continue;
209
+ }
210
+ const tag = authoredScalar(axis.attributes[0]);
211
+ out.axes.push({
212
+ gridId, axisId, family, AxisTag: typeof tag === 'string' ? tag : String(tag ?? ''),
213
+ a: [a[0] * scale, a[1] * scale], b: [b[0] * scale, b[1] * scale],
214
+ });
215
+ }
216
+ }
217
+ }
218
+ return out;
219
+ }
220
+ //# sourceMappingURL=extract-grids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-grids.js","sourceRoot":"","sources":["../../src/in-store/extract-grids.ts"],"names":[],"mappings":"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"}