@pascal-app/core 1.0.5 → 1.0.7

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 (940) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +31 -0
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -1
  4. package/dist/agent-operations/__fixtures__/build-room-cases.js +27 -0
  5. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  6. package/dist/agent-operations/__fixtures__/cases.js +19 -11
  7. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts +25 -2
  8. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts.map +1 -1
  9. package/dist/agent-operations/__fixtures__/design-brief-cases.js +509 -66
  10. package/dist/agent-operations/__fixtures__/dressing-scenes.d.ts +30 -0
  11. package/dist/agent-operations/__fixtures__/dressing-scenes.d.ts.map +1 -0
  12. package/dist/agent-operations/__fixtures__/dressing-scenes.js +82 -0
  13. package/dist/agent-operations/__fixtures__/native-materials.d.ts +407 -9
  14. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -1
  15. package/dist/agent-operations/__fixtures__/notation-cases.d.ts.map +1 -1
  16. package/dist/agent-operations/__fixtures__/notation-cases.js +14 -0
  17. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +7253 -4053
  18. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -1
  19. package/dist/agent-operations/__fixtures__/room-cases.d.ts +1 -0
  20. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -1
  21. package/dist/agent-operations/__fixtures__/room-cases.js +57 -1
  22. package/dist/agent-operations/__fixtures__/room-check-scenes.d.ts +51 -0
  23. package/dist/agent-operations/__fixtures__/room-check-scenes.d.ts.map +1 -0
  24. package/dist/agent-operations/__fixtures__/room-check-scenes.js +121 -0
  25. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts.map +1 -1
  26. package/dist/agent-operations/__fixtures__/scene-check-cases.js +152 -18
  27. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -1
  28. package/dist/agent-operations/__fixtures__/search-assets-cases.js +91 -0
  29. package/dist/agent-operations/__fixtures__/site-cases.d.ts +40 -1
  30. package/dist/agent-operations/__fixtures__/site-cases.d.ts.map +1 -1
  31. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +3 -0
  32. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -1
  33. package/dist/agent-operations/__fixtures__/structure-cases.js +199 -18
  34. package/dist/agent-operations/__fixtures__/unit-cases.d.ts +6 -0
  35. package/dist/agent-operations/__fixtures__/unit-cases.d.ts.map +1 -0
  36. package/dist/agent-operations/__fixtures__/unit-cases.js +266 -0
  37. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +109 -73
  38. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -1
  39. package/dist/agent-operations/add-column.d.ts.map +1 -1
  40. package/dist/agent-operations/add-column.js +32 -3
  41. package/dist/agent-operations/add-fence.d.ts.map +1 -1
  42. package/dist/agent-operations/add-fence.js +2 -1
  43. package/dist/agent-operations/add-level.d.ts.map +1 -1
  44. package/dist/agent-operations/add-level.js +4 -4
  45. package/dist/agent-operations/add-object.d.ts +32 -6
  46. package/dist/agent-operations/add-object.d.ts.map +1 -1
  47. package/dist/agent-operations/add-object.js +59 -12
  48. package/dist/agent-operations/add-wall.d.ts +3 -8
  49. package/dist/agent-operations/add-wall.d.ts.map +1 -1
  50. package/dist/agent-operations/add-wall.js +31 -8
  51. package/dist/agent-operations/apply-changes.d.ts.map +1 -1
  52. package/dist/agent-operations/apply-changes.js +2 -1
  53. package/dist/agent-operations/asset-catalog.d.ts +63 -0
  54. package/dist/agent-operations/asset-catalog.d.ts.map +1 -0
  55. package/dist/agent-operations/asset-catalog.js +182 -0
  56. package/dist/agent-operations/asset-views.d.ts +4 -2
  57. package/dist/agent-operations/asset-views.d.ts.map +1 -1
  58. package/dist/agent-operations/asset-views.js +1 -3
  59. package/dist/agent-operations/author-scene-checks.d.ts +38 -0
  60. package/dist/agent-operations/author-scene-checks.d.ts.map +1 -0
  61. package/dist/agent-operations/author-scene-checks.js +266 -0
  62. package/dist/agent-operations/author-scene.d.ts +54 -20
  63. package/dist/agent-operations/author-scene.d.ts.map +1 -1
  64. package/dist/agent-operations/author-scene.js +1164 -196
  65. package/dist/agent-operations/authored-scene-merge.d.ts.map +1 -1
  66. package/dist/agent-operations/authored-scene-merge.js +61 -3
  67. package/dist/agent-operations/batch.d.ts +1 -1
  68. package/dist/agent-operations/batch.d.ts.map +1 -1
  69. package/dist/agent-operations/batch.js +38 -39
  70. package/dist/agent-operations/ceiling-object-observations.d.ts.map +1 -1
  71. package/dist/agent-operations/ceiling-object-observations.js +5 -4
  72. package/dist/agent-operations/circulation-geometry.d.ts +14 -0
  73. package/dist/agent-operations/circulation-geometry.d.ts.map +1 -0
  74. package/dist/agent-operations/circulation-geometry.js +151 -0
  75. package/dist/agent-operations/circulation-graph.d.ts +72 -0
  76. package/dist/agent-operations/circulation-graph.d.ts.map +1 -0
  77. package/dist/agent-operations/circulation-graph.js +713 -0
  78. package/dist/agent-operations/circulation-non-spaces.d.ts +10 -0
  79. package/dist/agent-operations/circulation-non-spaces.d.ts.map +1 -0
  80. package/dist/agent-operations/circulation-non-spaces.js +88 -0
  81. package/dist/agent-operations/circulation-spaces.d.ts +5880 -0
  82. package/dist/agent-operations/circulation-spaces.d.ts.map +1 -0
  83. package/dist/agent-operations/circulation-spaces.js +368 -0
  84. package/dist/agent-operations/collections.d.ts.map +1 -1
  85. package/dist/agent-operations/collections.js +9 -7
  86. package/dist/agent-operations/corner-window.d.ts.map +1 -1
  87. package/dist/agent-operations/corner-window.js +2 -4
  88. package/dist/agent-operations/create-roof.d.ts.map +1 -1
  89. package/dist/agent-operations/create-roof.js +5 -7
  90. package/dist/agent-operations/create-room.d.ts +4 -1
  91. package/dist/agent-operations/create-room.d.ts.map +1 -1
  92. package/dist/agent-operations/create-room.js +7 -4
  93. package/dist/agent-operations/create-stair.js +2 -2
  94. package/dist/agent-operations/design-brief.d.ts +13 -7
  95. package/dist/agent-operations/design-brief.d.ts.map +1 -1
  96. package/dist/agent-operations/design-brief.js +172 -92
  97. package/dist/agent-operations/door-clearance.d.ts +68 -8
  98. package/dist/agent-operations/door-clearance.d.ts.map +1 -1
  99. package/dist/agent-operations/door-clearance.js +127 -20
  100. package/dist/agent-operations/dress-targets.d.ts +23 -0
  101. package/dist/agent-operations/dress-targets.d.ts.map +1 -0
  102. package/dist/agent-operations/dress-targets.js +34 -0
  103. package/dist/agent-operations/duplicate-node.d.ts +14 -0
  104. package/dist/agent-operations/duplicate-node.d.ts.map +1 -0
  105. package/dist/agent-operations/duplicate-node.js +173 -0
  106. package/dist/agent-operations/find-by-type.d.ts.map +1 -1
  107. package/dist/agent-operations/find-by-type.js +3 -0
  108. package/dist/agent-operations/furnish-room.d.ts +2 -0
  109. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  110. package/dist/agent-operations/furnish-room.js +15 -4
  111. package/dist/agent-operations/furniture-kind.d.ts +28 -1
  112. package/dist/agent-operations/furniture-kind.d.ts.map +1 -1
  113. package/dist/agent-operations/furniture-kind.js +105 -6
  114. package/dist/agent-operations/ground-reader.d.ts +10 -0
  115. package/dist/agent-operations/ground-reader.d.ts.map +1 -0
  116. package/dist/agent-operations/ground-reader.js +25 -0
  117. package/dist/agent-operations/index.d.ts +118 -12
  118. package/dist/agent-operations/index.d.ts.map +1 -1
  119. package/dist/agent-operations/index.js +26 -1
  120. package/dist/agent-operations/item-solids.d.ts +39 -0
  121. package/dist/agent-operations/item-solids.d.ts.map +1 -0
  122. package/dist/agent-operations/item-solids.js +128 -0
  123. package/dist/agent-operations/layout-clearance.d.ts +91 -11
  124. package/dist/agent-operations/layout-clearance.d.ts.map +1 -1
  125. package/dist/agent-operations/layout-clearance.js +280 -73
  126. package/dist/agent-operations/level-height-fill.d.ts.map +1 -1
  127. package/dist/agent-operations/level-height-fill.js +7 -1
  128. package/dist/agent-operations/level-reads.d.ts +5 -0
  129. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  130. package/dist/agent-operations/level-reads.js +38 -2
  131. package/dist/agent-operations/list-levels.d.ts.map +1 -1
  132. package/dist/agent-operations/list-levels.js +2 -4
  133. package/dist/agent-operations/move-node.d.ts +12 -0
  134. package/dist/agent-operations/move-node.d.ts.map +1 -0
  135. package/dist/agent-operations/move-node.js +28 -0
  136. package/dist/agent-operations/move-plan.d.ts +28 -0
  137. package/dist/agent-operations/move-plan.d.ts.map +1 -0
  138. package/dist/agent-operations/move-plan.js +257 -0
  139. package/dist/agent-operations/node-patch.d.ts.map +1 -1
  140. package/dist/agent-operations/node-patch.js +15 -0
  141. package/dist/agent-operations/paint.d.ts +3 -1
  142. package/dist/agent-operations/paint.d.ts.map +1 -1
  143. package/dist/agent-operations/paint.js +14 -1
  144. package/dist/agent-operations/photo-elevation.d.ts.map +1 -1
  145. package/dist/agent-operations/photo-elevation.js +2 -1
  146. package/dist/agent-operations/place-in-room.d.ts.map +1 -1
  147. package/dist/agent-operations/place-in-room.js +1 -0
  148. package/dist/agent-operations/place-items.d.ts.map +1 -1
  149. package/dist/agent-operations/place-items.js +3 -4
  150. package/dist/agent-operations/plan-clearance.d.ts +28 -0
  151. package/dist/agent-operations/plan-clearance.d.ts.map +1 -0
  152. package/dist/agent-operations/plan-clearance.js +47 -0
  153. package/dist/agent-operations/plan-geometry.d.ts +2 -0
  154. package/dist/agent-operations/plan-geometry.d.ts.map +1 -1
  155. package/dist/agent-operations/plan-geometry.js +10 -0
  156. package/dist/agent-operations/project-files.d.ts +10 -0
  157. package/dist/agent-operations/project-files.d.ts.map +1 -1
  158. package/dist/agent-operations/reachability.d.ts +41 -0
  159. package/dist/agent-operations/reachability.d.ts.map +1 -0
  160. package/dist/agent-operations/reachability.js +199 -0
  161. package/dist/agent-operations/room-checks.d.ts +60 -0
  162. package/dist/agent-operations/room-checks.d.ts.map +1 -0
  163. package/dist/agent-operations/room-checks.js +226 -0
  164. package/dist/agent-operations/room-faces.d.ts +30 -0
  165. package/dist/agent-operations/room-faces.d.ts.map +1 -0
  166. package/dist/agent-operations/room-faces.js +31 -0
  167. package/dist/agent-operations/room-findings.d.ts +5 -2
  168. package/dist/agent-operations/room-findings.d.ts.map +1 -1
  169. package/dist/agent-operations/room-findings.js +30 -0
  170. package/dist/agent-operations/room-finishes.d.ts +87 -0
  171. package/dist/agent-operations/room-finishes.d.ts.map +1 -0
  172. package/dist/agent-operations/room-finishes.js +193 -0
  173. package/dist/agent-operations/room-floor-script.d.ts +3 -3
  174. package/dist/agent-operations/room-floor-script.js +3 -3
  175. package/dist/agent-operations/room-readings.d.ts +90 -0
  176. package/dist/agent-operations/room-readings.d.ts.map +1 -0
  177. package/dist/agent-operations/room-readings.js +369 -0
  178. package/dist/agent-operations/room-tile.d.ts +15 -0
  179. package/dist/agent-operations/room-tile.d.ts.map +1 -0
  180. package/dist/agent-operations/room-tile.js +30 -0
  181. package/dist/agent-operations/room-wet.d.ts +55 -0
  182. package/dist/agent-operations/room-wet.d.ts.map +1 -0
  183. package/dist/agent-operations/room-wet.js +203 -0
  184. package/dist/agent-operations/scene-check-policy.d.ts +5 -0
  185. package/dist/agent-operations/scene-check-policy.d.ts.map +1 -0
  186. package/dist/agent-operations/scene-check-policy.js +24 -0
  187. package/dist/agent-operations/scene-checkpoint.d.ts +10 -0
  188. package/dist/agent-operations/scene-checkpoint.d.ts.map +1 -1
  189. package/dist/agent-operations/scene-checkpoint.js +31 -0
  190. package/dist/agent-operations/scene-issue-groups.d.ts +17 -0
  191. package/dist/agent-operations/scene-issue-groups.d.ts.map +1 -0
  192. package/dist/agent-operations/scene-issue-groups.js +71 -0
  193. package/dist/agent-operations/scene-materials.d.ts +23 -0
  194. package/dist/agent-operations/scene-materials.d.ts.map +1 -1
  195. package/dist/agent-operations/scene-materials.js +41 -0
  196. package/dist/agent-operations/scene-queries.d.ts +1667 -866
  197. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  198. package/dist/agent-operations/scene-queries.js +3 -3
  199. package/dist/agent-operations/scene-review.d.ts.map +1 -1
  200. package/dist/agent-operations/scene-review.js +3 -2
  201. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  202. package/dist/agent-operations/scene-view.js +91 -21
  203. package/dist/agent-operations/search-assets.d.ts +10 -6
  204. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  205. package/dist/agent-operations/search-assets.js +37 -22
  206. package/dist/agent-operations/set-checkpoint.d.ts.map +1 -1
  207. package/dist/agent-operations/set-checkpoint.js +1 -0
  208. package/dist/agent-operations/set-ground-level.d.ts +1 -1
  209. package/dist/agent-operations/set-ground-level.d.ts.map +1 -1
  210. package/dist/agent-operations/set-ground-level.js +3 -14
  211. package/dist/agent-operations/site.js +3 -2
  212. package/dist/agent-operations/slab-surface-script.d.ts +25 -0
  213. package/dist/agent-operations/slab-surface-script.d.ts.map +1 -0
  214. package/dist/agent-operations/slab-surface-script.js +60 -0
  215. package/dist/agent-operations/stair-plan-footprint.d.ts +9 -0
  216. package/dist/agent-operations/stair-plan-footprint.d.ts.map +1 -0
  217. package/dist/agent-operations/stair-plan-footprint.js +50 -0
  218. package/dist/agent-operations/types.d.ts +10 -5
  219. package/dist/agent-operations/types.d.ts.map +1 -1
  220. package/dist/agent-operations/units.d.ts +26 -0
  221. package/dist/agent-operations/units.d.ts.map +1 -0
  222. package/dist/agent-operations/units.js +110 -0
  223. package/dist/agent-operations/unreachable-rooms-check.d.ts +17 -0
  224. package/dist/agent-operations/unreachable-rooms-check.d.ts.map +1 -0
  225. package/dist/agent-operations/unreachable-rooms-check.js +35 -0
  226. package/dist/agent-operations/usage-checks.d.ts +2 -0
  227. package/dist/agent-operations/usage-checks.d.ts.map +1 -0
  228. package/dist/agent-operations/usage-checks.js +12 -0
  229. package/dist/agent-operations/verify-scene.d.ts +8 -11
  230. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  231. package/dist/agent-operations/verify-scene.js +55 -11
  232. package/dist/agent-operations/wall-face-defaults.d.ts +44 -0
  233. package/dist/agent-operations/wall-face-defaults.d.ts.map +1 -0
  234. package/dist/agent-operations/wall-face-defaults.js +229 -0
  235. package/dist/agent-operations/wall-joins.d.ts +119 -0
  236. package/dist/agent-operations/wall-joins.d.ts.map +1 -0
  237. package/dist/agent-operations/wall-joins.js +308 -0
  238. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -1
  239. package/dist/agent-operations/wall-object-observations.js +4 -6
  240. package/dist/agent-operations/wall-skirting.d.ts.map +1 -1
  241. package/dist/agent-operations/wall-skirting.js +2 -0
  242. package/dist/agent-operations/wall-type.d.ts +49 -0
  243. package/dist/agent-operations/wall-type.d.ts.map +1 -0
  244. package/dist/agent-operations/wall-type.js +31 -0
  245. package/dist/agent-operations/zone-coverage.d.ts +85 -0
  246. package/dist/agent-operations/zone-coverage.d.ts.map +1 -0
  247. package/dist/agent-operations/zone-coverage.js +208 -0
  248. package/dist/agent-tools/add-object.d.ts +31 -0
  249. package/dist/agent-tools/add-object.d.ts.map +1 -1
  250. package/dist/agent-tools/add-object.js +44 -7
  251. package/dist/agent-tools/assets.d.ts +4 -0
  252. package/dist/agent-tools/assets.d.ts.map +1 -1
  253. package/dist/agent-tools/assets.js +11 -1
  254. package/dist/agent-tools/author-scene.d.ts +810 -15
  255. package/dist/agent-tools/author-scene.d.ts.map +1 -1
  256. package/dist/agent-tools/author-scene.js +275 -34
  257. package/dist/agent-tools/batch.d.ts +1 -1
  258. package/dist/agent-tools/batch.d.ts.map +1 -1
  259. package/dist/agent-tools/batch.js +5 -1
  260. package/dist/agent-tools/checkpoints.js +1 -1
  261. package/dist/agent-tools/columns.d.ts +14 -0
  262. package/dist/agent-tools/columns.d.ts.map +1 -1
  263. package/dist/agent-tools/columns.js +14 -2
  264. package/dist/agent-tools/contract.d.ts +10 -0
  265. package/dist/agent-tools/contract.d.ts.map +1 -1
  266. package/dist/agent-tools/contract.js +5 -1
  267. package/dist/agent-tools/corner-window.d.ts +1 -0
  268. package/dist/agent-tools/corner-window.d.ts.map +1 -1
  269. package/dist/agent-tools/corner-window.js +1 -1
  270. package/dist/agent-tools/create-room.d.ts +85 -0
  271. package/dist/agent-tools/create-room.d.ts.map +1 -1
  272. package/dist/agent-tools/create-room.js +8 -1
  273. package/dist/agent-tools/design-brief.d.ts +513 -7
  274. package/dist/agent-tools/design-brief.d.ts.map +1 -1
  275. package/dist/agent-tools/design-brief.js +192 -14
  276. package/dist/agent-tools/designs.js +1 -1
  277. package/dist/agent-tools/find-by-type.js +1 -1
  278. package/dist/agent-tools/index.d.ts +658 -10
  279. package/dist/agent-tools/index.d.ts.map +1 -1
  280. package/dist/agent-tools/index.js +9 -1
  281. package/dist/agent-tools/levels.js +4 -4
  282. package/dist/agent-tools/move-duplicate.d.ts +65 -0
  283. package/dist/agent-tools/move-duplicate.d.ts.map +1 -0
  284. package/dist/agent-tools/move-duplicate.js +68 -0
  285. package/dist/agent-tools/paint.d.ts +6 -0
  286. package/dist/agent-tools/paint.d.ts.map +1 -1
  287. package/dist/agent-tools/paint.js +7 -3
  288. package/dist/agent-tools/photo-elevation.js +1 -1
  289. package/dist/agent-tools/project-files.d.ts +2 -2
  290. package/dist/agent-tools/project-files.d.ts.map +1 -1
  291. package/dist/agent-tools/project-files.js +1 -1
  292. package/dist/agent-tools/refusal.d.ts +9 -1
  293. package/dist/agent-tools/refusal.d.ts.map +1 -1
  294. package/dist/agent-tools/refusal.js +5 -1
  295. package/dist/agent-tools/roofs.js +1 -1
  296. package/dist/agent-tools/room-structure.d.ts +60 -0
  297. package/dist/agent-tools/room-structure.d.ts.map +1 -1
  298. package/dist/agent-tools/room-structure.js +20 -1
  299. package/dist/agent-tools/search-materials.d.ts +1 -0
  300. package/dist/agent-tools/search-materials.d.ts.map +1 -1
  301. package/dist/agent-tools/site.js +1 -1
  302. package/dist/agent-tools/stairs.js +1 -1
  303. package/dist/agent-tools/units.d.ts +84 -0
  304. package/dist/agent-tools/units.d.ts.map +1 -0
  305. package/dist/agent-tools/units.js +54 -0
  306. package/dist/agent-tools/verify-scene-usage.d.ts +44 -0
  307. package/dist/agent-tools/verify-scene-usage.d.ts.map +1 -0
  308. package/dist/agent-tools/verify-scene-usage.js +146 -0
  309. package/dist/agent-tools/verify-scene.d.ts +12 -1
  310. package/dist/agent-tools/verify-scene.d.ts.map +1 -1
  311. package/dist/agent-tools/verify-scene.js +183 -3
  312. package/dist/agent-tools/view-scene.d.ts +3 -0
  313. package/dist/agent-tools/view-scene.d.ts.map +1 -1
  314. package/dist/agent-tools/view-scene.js +4 -1
  315. package/dist/agent-tools/wall-openings.d.ts +121 -2
  316. package/dist/agent-tools/wall-openings.d.ts.map +1 -1
  317. package/dist/agent-tools/wall-openings.js +123 -18
  318. package/dist/agent-tools/walls.d.ts +30 -0
  319. package/dist/agent-tools/walls.d.ts.map +1 -1
  320. package/dist/agent-tools/walls.js +54 -2
  321. package/dist/building/__fixtures__/wall-opening-cases.d.ts +340 -195
  322. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  323. package/dist/building/__fixtures__/wall-opening-cases.js +13 -0
  324. package/dist/building/code-profile.d.ts +231 -0
  325. package/dist/building/code-profile.d.ts.map +1 -0
  326. package/dist/building/code-profile.js +208 -0
  327. package/dist/building/corner-window.d.ts +2 -2
  328. package/dist/building/corner-window.d.ts.map +1 -1
  329. package/dist/building/corner-window.js +11 -2
  330. package/dist/building/door-types.d.ts +1 -0
  331. package/dist/building/door-types.d.ts.map +1 -1
  332. package/dist/building/door-types.js +2 -0
  333. package/dist/building/floor-item-fit.d.ts.map +1 -1
  334. package/dist/building/floor-item-fit.js +2 -4
  335. package/dist/building/ground-level.d.ts +1 -3
  336. package/dist/building/ground-level.d.ts.map +1 -1
  337. package/dist/building/ground-level.js +3 -5
  338. package/dist/building/index.d.ts +2 -0
  339. package/dist/building/index.d.ts.map +1 -1
  340. package/dist/building/index.js +2 -0
  341. package/dist/building/level-duplication.d.ts +5951 -4351
  342. package/dist/building/level-duplication.d.ts.map +1 -1
  343. package/dist/building/level-insertion.d.ts +1 -1
  344. package/dist/building/level-wall-copy.d.ts +24 -0
  345. package/dist/building/level-wall-copy.d.ts.map +1 -0
  346. package/dist/building/level-wall-copy.js +53 -0
  347. package/dist/building/merge-windows.d.ts.map +1 -1
  348. package/dist/building/merge-windows.js +1 -0
  349. package/dist/building/opening-style-presets.d.ts +2 -0
  350. package/dist/building/opening-style-presets.d.ts.map +1 -1
  351. package/dist/building/opening-style-presets.js +26 -5
  352. package/dist/building/room-use.d.ts +26 -0
  353. package/dist/building/room-use.d.ts.map +1 -0
  354. package/dist/building/room-use.js +102 -0
  355. package/dist/building/wall-openings.d.ts +115 -7
  356. package/dist/building/wall-openings.d.ts.map +1 -1
  357. package/dist/building/wall-openings.js +121 -29
  358. package/dist/building/window-types.d.ts +1 -0
  359. package/dist/building/window-types.d.ts.map +1 -1
  360. package/dist/building/window-types.js +3 -0
  361. package/dist/coherence/__fixtures__/enclosure-scenes.d.ts +84 -0
  362. package/dist/coherence/__fixtures__/enclosure-scenes.d.ts.map +1 -0
  363. package/dist/coherence/__fixtures__/enclosure-scenes.js +44 -0
  364. package/dist/commands/structure/attached-walls.d.ts +16 -0
  365. package/dist/commands/structure/attached-walls.d.ts.map +1 -0
  366. package/dist/commands/structure/attached-walls.js +53 -0
  367. package/dist/commands/structure/index.d.ts +3 -0
  368. package/dist/commands/structure/index.d.ts.map +1 -1
  369. package/dist/commands/structure/index.js +3 -0
  370. package/dist/commands/structure/move-separators.d.ts +62 -0
  371. package/dist/commands/structure/move-separators.d.ts.map +1 -0
  372. package/dist/commands/structure/move-separators.js +346 -0
  373. package/dist/commands/structure/set-floor-foundation.d.ts +5 -0
  374. package/dist/commands/structure/set-floor-foundation.d.ts.map +1 -1
  375. package/dist/commands/structure/set-wall-geometry.d.ts.map +1 -1
  376. package/dist/commands/structure/set-wall-geometry.js +44 -11
  377. package/dist/commands/structure/set-zone-intent.d.ts +26 -0
  378. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -1
  379. package/dist/commands/structure/set-zone-intent.js +107 -2
  380. package/dist/commands/structure/shared.d.ts +888 -88
  381. package/dist/commands/structure/shared.d.ts.map +1 -1
  382. package/dist/commands/structure/wall-overlap.d.ts +45 -0
  383. package/dist/commands/structure/wall-overlap.d.ts.map +1 -0
  384. package/dist/commands/structure/wall-overlap.js +289 -0
  385. package/dist/commands/structure/zone-wall-merge.d.ts +3326 -2370
  386. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  387. package/dist/contracts/reference-discovery.d.ts +2 -2
  388. package/dist/contracts/reference-discovery.d.ts.map +1 -1
  389. package/dist/contracts/reference-discovery.js +5 -3
  390. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  391. package/dist/contracts/reference-inventory.js +75 -24
  392. package/dist/events/bus.d.ts +15 -2
  393. package/dist/events/bus.d.ts.map +1 -1
  394. package/dist/hooks/spatial-grid/built-in-floor-placed.d.ts +40 -0
  395. package/dist/hooks/spatial-grid/built-in-floor-placed.d.ts.map +1 -0
  396. package/dist/hooks/spatial-grid/built-in-floor-placed.js +220 -0
  397. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  398. package/dist/hooks/spatial-grid/floor-placed-elevation.js +13 -7
  399. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +56 -1
  400. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  401. package/dist/hooks/spatial-grid/spatial-grid-manager.js +177 -27
  402. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +1631 -831
  403. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  404. package/dist/hooks/spatial-grid/spatial-grid-sync.js +24 -1
  405. package/dist/hooks/spatial-grid/support-host-patch.js +10 -10
  406. package/dist/i18n/format.d.ts +41 -0
  407. package/dist/i18n/format.d.ts.map +1 -0
  408. package/dist/i18n/format.js +124 -0
  409. package/dist/i18n/index.d.ts +5 -0
  410. package/dist/i18n/index.d.ts.map +1 -0
  411. package/dist/i18n/index.js +3 -0
  412. package/dist/i18n/registry.d.ts +78 -0
  413. package/dist/i18n/registry.d.ts.map +1 -0
  414. package/dist/i18n/registry.js +252 -0
  415. package/dist/i18n/use-translate.d.ts +16 -0
  416. package/dist/i18n/use-translate.d.ts.map +1 -0
  417. package/dist/i18n/use-translate.js +23 -0
  418. package/dist/index.d.ts +32 -16
  419. package/dist/index.d.ts.map +1 -1
  420. package/dist/index.js +31 -15
  421. package/dist/lib/__fixtures__/mezzanine.d.ts +6840 -4169
  422. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  423. package/dist/lib/absorb-wall-separators.d.ts +2128 -1328
  424. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  425. package/dist/lib/beam.d.ts +137 -0
  426. package/dist/lib/beam.d.ts.map +1 -0
  427. package/dist/lib/beam.js +297 -0
  428. package/dist/lib/below-grade-footprints.d.ts +13 -5
  429. package/dist/lib/below-grade-footprints.d.ts.map +1 -1
  430. package/dist/lib/below-grade-footprints.js +53 -10
  431. package/dist/lib/build-up.d.ts +89 -0
  432. package/dist/lib/build-up.d.ts.map +1 -0
  433. package/dist/lib/build-up.js +216 -0
  434. package/dist/lib/corner-pair.d.ts +205 -4
  435. package/dist/lib/corner-pair.d.ts.map +1 -1
  436. package/dist/lib/deck-boards.d.ts +80 -0
  437. package/dist/lib/deck-boards.d.ts.map +1 -0
  438. package/dist/lib/deck-boards.js +184 -0
  439. package/dist/lib/deck-framing.d.ts +150 -0
  440. package/dist/lib/deck-framing.d.ts.map +1 -0
  441. package/dist/lib/deck-framing.js +515 -0
  442. package/dist/lib/deepest-drawn.d.ts +3 -6
  443. package/dist/lib/deepest-drawn.d.ts.map +1 -1
  444. package/dist/lib/deepest-drawn.js +4 -8
  445. package/dist/lib/door-opening.d.ts +19 -0
  446. package/dist/lib/door-opening.d.ts.map +1 -0
  447. package/dist/lib/door-opening.js +27 -0
  448. package/dist/lib/door-operation.d.ts +2 -0
  449. package/dist/lib/door-operation.d.ts.map +1 -1
  450. package/dist/lib/door-operation.js +4 -0
  451. package/dist/lib/exterior-wall-loops.d.ts.map +1 -1
  452. package/dist/lib/exterior-wall-loops.js +2 -1
  453. package/dist/lib/finish-script.d.ts +5 -5
  454. package/dist/lib/finish-script.d.ts.map +1 -1
  455. package/dist/lib/finish-script.js +12 -5
  456. package/dist/lib/floor-footprint-name.d.ts +17 -0
  457. package/dist/lib/floor-footprint-name.d.ts.map +1 -1
  458. package/dist/lib/floor-footprint-name.js +17 -4
  459. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  460. package/dist/lib/floor-intent-changes.js +60 -35
  461. package/dist/lib/floor-opening-footprints.d.ts +1 -1
  462. package/dist/lib/floor-opening-footprints.d.ts.map +1 -1
  463. package/dist/lib/floor-opening-footprints.js +10 -4
  464. package/dist/lib/floor-plate-paint.d.ts +2 -0
  465. package/dist/lib/floor-plate-paint.d.ts.map +1 -1
  466. package/dist/lib/floor-plate-paint.js +12 -0
  467. package/dist/lib/floor-plates.d.ts +250 -0
  468. package/dist/lib/floor-plates.d.ts.map +1 -1
  469. package/dist/lib/floor-plates.js +43 -4
  470. package/dist/lib/floor-script.d.ts +35 -6
  471. package/dist/lib/floor-script.d.ts.map +1 -1
  472. package/dist/lib/floor-script.js +96 -16
  473. package/dist/lib/foundation-construction.d.ts +4 -13
  474. package/dist/lib/foundation-construction.d.ts.map +1 -1
  475. package/dist/lib/foundation-construction.js +4 -14
  476. package/dist/lib/foundation-standard.d.ts +2 -3
  477. package/dist/lib/foundation-standard.d.ts.map +1 -1
  478. package/dist/lib/foundation-standard.js +2 -3
  479. package/dist/lib/foundation-wall.d.ts +1 -2
  480. package/dist/lib/foundation-wall.d.ts.map +1 -1
  481. package/dist/lib/foundation-wall.js +1 -2
  482. package/dist/lib/framing-post.d.ts +91 -0
  483. package/dist/lib/framing-post.d.ts.map +1 -0
  484. package/dist/lib/framing-post.js +174 -0
  485. package/dist/lib/geometry-script-node.d.ts +11 -0
  486. package/dist/lib/geometry-script-node.d.ts.map +1 -1
  487. package/dist/lib/geometry-script-node.js +35 -0
  488. package/dist/lib/grade-standing.d.ts +16 -2
  489. package/dist/lib/grade-standing.d.ts.map +1 -1
  490. package/dist/lib/grade-standing.js +129 -9
  491. package/dist/lib/ground-seat.d.ts +2 -22
  492. package/dist/lib/ground-seat.d.ts.map +1 -1
  493. package/dist/lib/ground-seat.js +2 -17
  494. package/dist/lib/ground-window.d.ts +2 -1
  495. package/dist/lib/ground-window.d.ts.map +1 -1
  496. package/dist/lib/ground-window.js +5 -2
  497. package/dist/lib/level-footprints.d.ts +2 -0
  498. package/dist/lib/level-footprints.d.ts.map +1 -1
  499. package/dist/lib/level-footprints.js +7 -0
  500. package/dist/lib/opening-casing.d.ts +67 -0
  501. package/dist/lib/opening-casing.d.ts.map +1 -0
  502. package/dist/lib/opening-casing.js +131 -0
  503. package/dist/lib/opening-exterior-face.d.ts +6 -0
  504. package/dist/lib/opening-exterior-face.d.ts.map +1 -0
  505. package/dist/lib/opening-exterior-face.js +15 -0
  506. package/dist/lib/opening-floor-datum.d.ts +11 -5
  507. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  508. package/dist/lib/opening-floor-datum.js +38 -6
  509. package/dist/lib/opening-frame-depth.d.ts +18 -0
  510. package/dist/lib/opening-frame-depth.d.ts.map +1 -0
  511. package/dist/lib/opening-frame-depth.js +22 -0
  512. package/dist/lib/outdoor-room.d.ts +32 -0
  513. package/dist/lib/outdoor-room.d.ts.map +1 -0
  514. package/dist/lib/outdoor-room.js +66 -0
  515. package/dist/lib/plate-surface.d.ts +8 -0
  516. package/dist/lib/plate-surface.d.ts.map +1 -1
  517. package/dist/lib/plate-surface.js +53 -3
  518. package/dist/lib/porch-framing-sync.d.ts +46 -0
  519. package/dist/lib/porch-framing-sync.d.ts.map +1 -0
  520. package/dist/lib/porch-framing-sync.js +206 -0
  521. package/dist/lib/porch-framing.d.ts +44 -0
  522. package/dist/lib/porch-framing.d.ts.map +1 -0
  523. package/dist/lib/porch-framing.js +159 -0
  524. package/dist/lib/railing-rooms.d.ts +13 -0
  525. package/dist/lib/railing-rooms.d.ts.map +1 -0
  526. package/dist/lib/railing-rooms.js +37 -0
  527. package/dist/lib/roof-eave.d.ts +135 -0
  528. package/dist/lib/roof-eave.d.ts.map +1 -0
  529. package/dist/lib/roof-eave.js +186 -0
  530. package/dist/lib/room-floor-plate.d.ts +3 -1
  531. package/dist/lib/room-floor-plate.d.ts.map +1 -1
  532. package/dist/lib/room-floor-plate.js +7 -0
  533. package/dist/lib/space-detection.d.ts +13 -0
  534. package/dist/lib/space-detection.d.ts.map +1 -1
  535. package/dist/lib/space-detection.js +112 -24
  536. package/dist/lib/structure-kernel.d.ts +22 -9
  537. package/dist/lib/structure-kernel.d.ts.map +1 -1
  538. package/dist/lib/structure-kernel.js +146 -28
  539. package/dist/lib/structure-reconcile.d.ts +1 -1
  540. package/dist/lib/structure-reconcile.d.ts.map +1 -1
  541. package/dist/lib/structure-reconcile.js +7 -4
  542. package/dist/lib/surface-intent.d.ts +10 -0
  543. package/dist/lib/surface-intent.d.ts.map +1 -0
  544. package/dist/lib/surface-intent.js +18 -0
  545. package/dist/lib/terrain-source.d.ts.map +1 -1
  546. package/dist/lib/terrain-source.js +2 -1
  547. package/dist/lib/wall-face-script.d.ts.map +1 -1
  548. package/dist/lib/wall-face-script.js +5 -2
  549. package/dist/material-kinds.d.ts +1 -1
  550. package/dist/material-kinds.d.ts.map +1 -1
  551. package/dist/material-kinds.js +1 -0
  552. package/dist/material-library.d.ts +15 -0
  553. package/dist/material-library.d.ts.map +1 -1
  554. package/dist/material-library.js +458 -59
  555. package/dist/node-slots/door.d.ts +3 -4
  556. package/dist/node-slots/door.d.ts.map +1 -1
  557. package/dist/node-slots/door.js +4 -3
  558. package/dist/node-slots/wall.d.ts.map +1 -1
  559. package/dist/node-slots/wall.js +21 -3
  560. package/dist/node-slots/window.d.ts +2 -2
  561. package/dist/node-slots/window.d.ts.map +1 -1
  562. package/dist/node-slots/window.js +6 -1
  563. package/dist/procedural-items/design.d.ts +8 -0
  564. package/dist/procedural-items/design.d.ts.map +1 -1
  565. package/dist/procedural-items/design.js +169 -21
  566. package/dist/procedural-items/motion-controller.d.ts +2 -0
  567. package/dist/procedural-items/motion-controller.d.ts.map +1 -1
  568. package/dist/procedural-items/motion-controller.js +2 -1
  569. package/dist/registry/index.d.ts +2 -2
  570. package/dist/registry/index.d.ts.map +1 -1
  571. package/dist/registry/index.js +1 -1
  572. package/dist/registry/mechanism.d.ts +4 -1
  573. package/dist/registry/mechanism.d.ts.map +1 -1
  574. package/dist/registry/mechanism.js +10 -0
  575. package/dist/registry/types.d.ts +65 -23
  576. package/dist/registry/types.d.ts.map +1 -1
  577. package/dist/runtime/__fixtures__/live-scene.d.ts +14 -0
  578. package/dist/runtime/__fixtures__/live-scene.d.ts.map +1 -0
  579. package/dist/runtime/__fixtures__/live-scene.js +64 -0
  580. package/dist/runtime/apply.d.ts +42 -0
  581. package/dist/runtime/apply.d.ts.map +1 -0
  582. package/dist/runtime/apply.js +274 -0
  583. package/dist/runtime/dependencies.d.ts +97 -0
  584. package/dist/runtime/dependencies.d.ts.map +1 -0
  585. package/dist/runtime/dependencies.js +42 -0
  586. package/dist/runtime/ids.d.ts +11 -0
  587. package/dist/runtime/ids.d.ts.map +1 -0
  588. package/dist/runtime/ids.js +80 -0
  589. package/dist/runtime/index.d.ts +14 -0
  590. package/dist/runtime/index.d.ts.map +1 -0
  591. package/dist/runtime/index.js +11 -0
  592. package/dist/runtime/node-queries.d.ts +16 -0
  593. package/dist/runtime/node-queries.d.ts.map +1 -0
  594. package/dist/runtime/node-queries.js +30 -0
  595. package/dist/runtime/patch.d.ts +26 -0
  596. package/dist/runtime/patch.d.ts.map +1 -0
  597. package/dist/runtime/patch.js +165 -0
  598. package/dist/runtime/reader.d.ts +104 -0
  599. package/dist/runtime/reader.d.ts.map +1 -0
  600. package/dist/runtime/reader.js +455 -0
  601. package/dist/runtime/scene-runtime.d.ts +112 -0
  602. package/dist/runtime/scene-runtime.d.ts.map +1 -0
  603. package/dist/runtime/scene-runtime.js +302 -0
  604. package/dist/schema/__fixtures__/node-fixtures.d.ts.map +1 -1
  605. package/dist/schema/__fixtures__/node-fixtures.js +1 -0
  606. package/dist/schema/assembly.d.ts +3 -0
  607. package/dist/schema/assembly.d.ts.map +1 -1
  608. package/dist/schema/assembly.js +13 -0
  609. package/dist/schema/asset-url.d.ts +37 -2
  610. package/dist/schema/asset-url.d.ts.map +1 -1
  611. package/dist/schema/asset-url.js +80 -11
  612. package/dist/schema/base.d.ts +8 -0
  613. package/dist/schema/base.d.ts.map +1 -1
  614. package/dist/schema/base.js +19 -1
  615. package/dist/schema/build-up.d.ts +247 -0
  616. package/dist/schema/build-up.d.ts.map +1 -0
  617. package/dist/schema/build-up.js +83 -0
  618. package/dist/schema/geometry-source.d.ts +80 -0
  619. package/dist/schema/geometry-source.d.ts.map +1 -1
  620. package/dist/schema/geometry-source.js +38 -0
  621. package/dist/schema/index.d.ts +12 -7
  622. package/dist/schema/index.d.ts.map +1 -1
  623. package/dist/schema/index.js +12 -6
  624. package/dist/schema/material.d.ts +5 -0
  625. package/dist/schema/material.d.ts.map +1 -1
  626. package/dist/schema/material.js +6 -0
  627. package/dist/schema/nodes/beam.d.ts +264 -0
  628. package/dist/schema/nodes/beam.d.ts.map +1 -0
  629. package/dist/schema/nodes/beam.js +139 -0
  630. package/dist/schema/nodes/box-vent.d.ts +5 -0
  631. package/dist/schema/nodes/box-vent.d.ts.map +1 -1
  632. package/dist/schema/nodes/cabinet.d.ts +10 -0
  633. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  634. package/dist/schema/nodes/ceiling.d.ts +48 -0
  635. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  636. package/dist/schema/nodes/ceiling.js +5 -0
  637. package/dist/schema/nodes/chimney.d.ts +10 -0
  638. package/dist/schema/nodes/chimney.d.ts.map +1 -1
  639. package/dist/schema/nodes/column.d.ts +42 -0
  640. package/dist/schema/nodes/column.d.ts.map +1 -1
  641. package/dist/schema/nodes/column.js +11 -1
  642. package/dist/schema/nodes/cupola.d.ts +5 -0
  643. package/dist/schema/nodes/cupola.d.ts.map +1 -1
  644. package/dist/schema/nodes/door.d.ts +54 -3
  645. package/dist/schema/nodes/door.d.ts.map +1 -1
  646. package/dist/schema/nodes/door.js +41 -7
  647. package/dist/schema/nodes/dormer.d.ts +20 -0
  648. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  649. package/dist/schema/nodes/downspout.d.ts +5 -0
  650. package/dist/schema/nodes/downspout.d.ts.map +1 -1
  651. package/dist/schema/nodes/elevator.d.ts +5 -0
  652. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  653. package/dist/schema/nodes/eyebrow-vent.d.ts +5 -0
  654. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -1
  655. package/dist/schema/nodes/fence.d.ts +5 -0
  656. package/dist/schema/nodes/fence.d.ts.map +1 -1
  657. package/dist/schema/nodes/guide.d.ts +14 -0
  658. package/dist/schema/nodes/guide.d.ts.map +1 -1
  659. package/dist/schema/nodes/guide.js +2 -0
  660. package/dist/schema/nodes/gutter.d.ts +5 -0
  661. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  662. package/dist/schema/nodes/item.d.ts +71 -0
  663. package/dist/schema/nodes/item.d.ts.map +1 -1
  664. package/dist/schema/nodes/item.js +5 -1
  665. package/dist/schema/nodes/level.d.ts +1 -1
  666. package/dist/schema/nodes/level.d.ts.map +1 -1
  667. package/dist/schema/nodes/opening-types.d.ts +13 -0
  668. package/dist/schema/nodes/opening-types.d.ts.map +1 -1
  669. package/dist/schema/nodes/opening-types.js +8 -1
  670. package/dist/schema/nodes/railing-wall.d.ts +112 -0
  671. package/dist/schema/nodes/railing-wall.d.ts.map +1 -0
  672. package/dist/schema/nodes/railing-wall.js +160 -0
  673. package/dist/schema/nodes/ridge-vent.d.ts +5 -0
  674. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  675. package/dist/schema/nodes/roof-segment.d.ts +224 -1
  676. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  677. package/dist/schema/nodes/roof-segment.js +57 -10
  678. package/dist/schema/nodes/roof-types.d.ts +11 -0
  679. package/dist/schema/nodes/roof-types.d.ts.map +1 -1
  680. package/dist/schema/nodes/roof-types.js +6 -0
  681. package/dist/schema/nodes/roof.d.ts +60 -0
  682. package/dist/schema/nodes/roof.d.ts.map +1 -1
  683. package/dist/schema/nodes/roof.js +4 -0
  684. package/dist/schema/nodes/shelf.d.ts +5 -0
  685. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  686. package/dist/schema/nodes/site.d.ts +80 -0
  687. package/dist/schema/nodes/site.d.ts.map +1 -1
  688. package/dist/schema/nodes/site.js +7 -0
  689. package/dist/schema/nodes/skylight.d.ts +10 -0
  690. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  691. package/dist/schema/nodes/slab.d.ts +137 -0
  692. package/dist/schema/nodes/slab.d.ts.map +1 -1
  693. package/dist/schema/nodes/slab.js +3 -0
  694. package/dist/schema/nodes/solar-panel.d.ts +10 -0
  695. package/dist/schema/nodes/solar-panel.d.ts.map +1 -1
  696. package/dist/schema/nodes/stair-segment.d.ts +5 -0
  697. package/dist/schema/nodes/stair-segment.d.ts.map +1 -1
  698. package/dist/schema/nodes/stair-structure.d.ts +69 -0
  699. package/dist/schema/nodes/stair-structure.d.ts.map +1 -0
  700. package/dist/schema/nodes/stair-structure.js +39 -0
  701. package/dist/schema/nodes/stair.d.ts +46 -0
  702. package/dist/schema/nodes/stair.d.ts.map +1 -1
  703. package/dist/schema/nodes/stair.js +3 -0
  704. package/dist/schema/nodes/turbine-vent.d.ts +5 -0
  705. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -1
  706. package/dist/schema/nodes/wall.d.ts +135 -2
  707. package/dist/schema/nodes/wall.d.ts.map +1 -1
  708. package/dist/schema/nodes/wall.js +42 -6
  709. package/dist/schema/nodes/window.d.ts +66 -1
  710. package/dist/schema/nodes/window.d.ts.map +1 -1
  711. package/dist/schema/nodes/window.js +50 -5
  712. package/dist/schema/nodes/zone.d.ts +68 -0
  713. package/dist/schema/nodes/zone.d.ts.map +1 -1
  714. package/dist/schema/nodes/zone.js +32 -0
  715. package/dist/schema/scene-material.d.ts +5 -0
  716. package/dist/schema/scene-material.d.ts.map +1 -1
  717. package/dist/schema/types.d.ts +1079 -4
  718. package/dist/schema/types.d.ts.map +1 -1
  719. package/dist/schema/types.js +2 -0
  720. package/dist/schema/wall-type.d.ts +95 -0
  721. package/dist/schema/wall-type.d.ts.map +1 -0
  722. package/dist/schema/wall-type.js +32 -0
  723. package/dist/services/roof-bearing.d.ts.map +1 -1
  724. package/dist/services/roof-bearing.js +6 -3
  725. package/dist/services/roof-level.d.ts.map +1 -1
  726. package/dist/services/roof-level.js +4 -3
  727. package/dist/services/roof-move.d.ts.map +1 -1
  728. package/dist/services/roof-move.js +13 -7
  729. package/dist/services/storey.d.ts.map +1 -1
  730. package/dist/services/storey.js +13 -8
  731. package/dist/spatial/usage-field/beds.d.ts +51 -0
  732. package/dist/spatial/usage-field/beds.d.ts.map +1 -0
  733. package/dist/spatial/usage-field/beds.js +346 -0
  734. package/dist/spatial/usage-field/blocked.d.ts +28 -0
  735. package/dist/spatial/usage-field/blocked.d.ts.map +1 -0
  736. package/dist/spatial/usage-field/blocked.js +185 -0
  737. package/dist/spatial/usage-field/boxes.d.ts +17 -0
  738. package/dist/spatial/usage-field/boxes.d.ts.map +1 -0
  739. package/dist/spatial/usage-field/boxes.js +82 -0
  740. package/dist/spatial/usage-field/catalogue-shapes.d.ts +3 -0
  741. package/dist/spatial/usage-field/catalogue-shapes.d.ts.map +1 -0
  742. package/dist/spatial/usage-field/catalogue-shapes.js +257 -0
  743. package/dist/spatial/usage-field/catalogue.d.ts +6 -0
  744. package/dist/spatial/usage-field/catalogue.d.ts.map +1 -0
  745. package/dist/spatial/usage-field/catalogue.js +11 -0
  746. package/dist/spatial/usage-field/clash.d.ts +40 -0
  747. package/dist/spatial/usage-field/clash.d.ts.map +1 -0
  748. package/dist/spatial/usage-field/clash.js +187 -0
  749. package/dist/spatial/usage-field/door-stairs.d.ts +18 -0
  750. package/dist/spatial/usage-field/door-stairs.d.ts.map +1 -0
  751. package/dist/spatial/usage-field/door-stairs.js +129 -0
  752. package/dist/spatial/usage-field/entry-way.d.ts +14 -0
  753. package/dist/spatial/usage-field/entry-way.d.ts.map +1 -0
  754. package/dist/spatial/usage-field/entry-way.js +219 -0
  755. package/dist/spatial/usage-field/fences.d.ts +18 -0
  756. package/dist/spatial/usage-field/fences.d.ts.map +1 -0
  757. package/dist/spatial/usage-field/fences.js +253 -0
  758. package/dist/spatial/usage-field/field.d.ts +44 -0
  759. package/dist/spatial/usage-field/field.d.ts.map +1 -0
  760. package/dist/spatial/usage-field/field.js +145 -0
  761. package/dist/spatial/usage-field/findings.d.ts +76 -0
  762. package/dist/spatial/usage-field/findings.d.ts.map +1 -0
  763. package/dist/spatial/usage-field/findings.js +252 -0
  764. package/dist/spatial/usage-field/fixtures.d.ts +18 -0
  765. package/dist/spatial/usage-field/fixtures.d.ts.map +1 -0
  766. package/dist/spatial/usage-field/fixtures.js +160 -0
  767. package/dist/spatial/usage-field/flag.d.ts +10 -0
  768. package/dist/spatial/usage-field/flag.d.ts.map +1 -0
  769. package/dist/spatial/usage-field/flag.js +12 -0
  770. package/dist/spatial/usage-field/floors.d.ts +13 -0
  771. package/dist/spatial/usage-field/floors.d.ts.map +1 -0
  772. package/dist/spatial/usage-field/floors.js +36 -0
  773. package/dist/spatial/usage-field/index.d.ts +7 -0
  774. package/dist/spatial/usage-field/index.d.ts.map +1 -0
  775. package/dist/spatial/usage-field/index.js +5 -0
  776. package/dist/spatial/usage-field/items.d.ts +38 -0
  777. package/dist/spatial/usage-field/items.d.ts.map +1 -0
  778. package/dist/spatial/usage-field/items.js +261 -0
  779. package/dist/spatial/usage-field/labels.d.ts +8 -0
  780. package/dist/spatial/usage-field/labels.d.ts.map +1 -0
  781. package/dist/spatial/usage-field/labels.js +14 -0
  782. package/dist/spatial/usage-field/level-field.d.ts +47 -0
  783. package/dist/spatial/usage-field/level-field.d.ts.map +1 -0
  784. package/dist/spatial/usage-field/level-field.js +96 -0
  785. package/dist/spatial/usage-field/measure.d.ts +324 -0
  786. package/dist/spatial/usage-field/measure.d.ts.map +1 -0
  787. package/dist/spatial/usage-field/measure.js +458 -0
  788. package/dist/spatial/usage-field/obstacles.d.ts +63 -0
  789. package/dist/spatial/usage-field/obstacles.d.ts.map +1 -0
  790. package/dist/spatial/usage-field/obstacles.js +215 -0
  791. package/dist/spatial/usage-field/openings.d.ts +12 -0
  792. package/dist/spatial/usage-field/openings.d.ts.map +1 -0
  793. package/dist/spatial/usage-field/openings.js +162 -0
  794. package/dist/spatial/usage-field/path.d.ts +48 -0
  795. package/dist/spatial/usage-field/path.d.ts.map +1 -0
  796. package/dist/spatial/usage-field/path.js +354 -0
  797. package/dist/spatial/usage-field/pieces.d.ts +27 -0
  798. package/dist/spatial/usage-field/pieces.d.ts.map +1 -0
  799. package/dist/spatial/usage-field/pieces.js +89 -0
  800. package/dist/spatial/usage-field/shapes.d.ts +18 -0
  801. package/dist/spatial/usage-field/shapes.d.ts.map +1 -0
  802. package/dist/spatial/usage-field/shapes.js +92 -0
  803. package/dist/spatial/usage-field/stairs.d.ts +23 -0
  804. package/dist/spatial/usage-field/stairs.d.ts.map +1 -0
  805. package/dist/spatial/usage-field/stairs.js +163 -0
  806. package/dist/spatial/usage-field/support.d.ts +24 -0
  807. package/dist/spatial/usage-field/support.d.ts.map +1 -0
  808. package/dist/spatial/usage-field/support.js +46 -0
  809. package/dist/spatial/usage-field/swings.d.ts +846 -0
  810. package/dist/spatial/usage-field/swings.d.ts.map +1 -0
  811. package/dist/spatial/usage-field/swings.js +427 -0
  812. package/dist/spatial/usage-field/types.d.ts +65 -0
  813. package/dist/spatial/usage-field/types.d.ts.map +1 -0
  814. package/dist/spatial/usage-field/types.js +1 -0
  815. package/dist/spatial/usage-field/walls.d.ts +1057 -0
  816. package/dist/spatial/usage-field/walls.d.ts.map +1 -0
  817. package/dist/spatial/usage-field/walls.js +166 -0
  818. package/dist/spatial/usage-field/way-in.d.ts +26 -0
  819. package/dist/spatial/usage-field/way-in.d.ts.map +1 -0
  820. package/dist/spatial/usage-field/way-in.js +113 -0
  821. package/dist/store/actions/node-actions.d.ts +2124 -1322
  822. package/dist/store/actions/node-actions.d.ts.map +1 -1
  823. package/dist/store/actions/node-actions.js +42 -16
  824. package/dist/store/derived-node-guard.d.ts +10 -2
  825. package/dist/store/derived-node-guard.d.ts.map +1 -1
  826. package/dist/store/derived-node-guard.js +31 -11
  827. package/dist/store/document-settling.d.ts +9 -0
  828. package/dist/store/document-settling.d.ts.map +1 -0
  829. package/dist/store/document-settling.js +22 -0
  830. package/dist/store/history-control.d.ts +19 -10
  831. package/dist/store/history-control.d.ts.map +1 -1
  832. package/dist/store/history-control.js +176 -127
  833. package/dist/store/history-drafts.d.ts.map +1 -1
  834. package/dist/store/history-drafts.js +21 -17
  835. package/dist/store/live-previews.d.ts +9 -0
  836. package/dist/store/live-previews.d.ts.map +1 -0
  837. package/dist/store/live-previews.js +19 -0
  838. package/dist/store/scene-annotations.d.ts +6751 -5151
  839. package/dist/store/scene-annotations.d.ts.map +1 -1
  840. package/dist/store/scene-environment.d.ts +33 -0
  841. package/dist/store/scene-environment.d.ts.map +1 -0
  842. package/dist/store/scene-environment.js +54 -0
  843. package/dist/store/scene-hydration.d.ts.map +1 -1
  844. package/dist/store/scene-hydration.js +41 -30
  845. package/dist/store/use-interactive.d.ts +9 -3
  846. package/dist/store/use-interactive.d.ts.map +1 -1
  847. package/dist/store/use-interactive.js +43 -11
  848. package/dist/store/use-live-node-overrides.d.ts.map +1 -1
  849. package/dist/store/use-live-node-overrides.js +3 -0
  850. package/dist/store/use-scene.d.ts +25 -0
  851. package/dist/store/use-scene.d.ts.map +1 -1
  852. package/dist/store/use-scene.js +408 -336
  853. package/dist/systems/document-reconcile.d.ts +40 -0
  854. package/dist/systems/document-reconcile.d.ts.map +1 -0
  855. package/dist/systems/document-reconcile.js +159 -0
  856. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  857. package/dist/systems/elevator/elevator-opening-system.js +9 -24
  858. package/dist/systems/fence/guard-layout.d.ts +69 -0
  859. package/dist/systems/fence/guard-layout.d.ts.map +1 -0
  860. package/dist/systems/fence/guard-layout.js +194 -0
  861. package/dist/systems/owned-floor-openings.d.ts +13 -1
  862. package/dist/systems/owned-floor-openings.d.ts.map +1 -1
  863. package/dist/systems/owned-floor-openings.js +58 -2
  864. package/dist/systems/reconcile-owned-floor-openings.d.ts +3 -1
  865. package/dist/systems/reconcile-owned-floor-openings.d.ts.map +1 -1
  866. package/dist/systems/reconcile-owned-floor-openings.js +4 -4
  867. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -1
  868. package/dist/systems/roof/roof-elevation-system.js +8 -26
  869. package/dist/systems/roof/roof-elevation.d.ts +16 -1
  870. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  871. package/dist/systems/roof/roof-elevation.js +85 -4
  872. package/dist/systems/roof/roof-footprint.d.ts +42 -1
  873. package/dist/systems/roof/roof-footprint.d.ts.map +1 -1
  874. package/dist/systems/roof/roof-footprint.js +160 -4
  875. package/dist/systems/slab/__fixtures__/floor-step.d.ts +3163 -1934
  876. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  877. package/dist/systems/slab/__fixtures__/raised-room.d.ts +2495 -1249
  878. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  879. package/dist/systems/stair/stair-clearance.d.ts +7 -0
  880. package/dist/systems/stair/stair-clearance.d.ts.map +1 -1
  881. package/dist/systems/stair/stair-clearance.js +31 -11
  882. package/dist/systems/stair/stair-construction.d.ts +8 -3
  883. package/dist/systems/stair/stair-construction.d.ts.map +1 -1
  884. package/dist/systems/stair/stair-construction.js +55 -4
  885. package/dist/systems/stair/stair-opening-preview.d.ts +889 -89
  886. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  887. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  888. package/dist/systems/stair/stair-opening-system.js +18 -34
  889. package/dist/systems/stair/stair-presets.d.ts +36 -0
  890. package/dist/systems/stair/stair-presets.d.ts.map +1 -1
  891. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -1
  892. package/dist/systems/stair/stair-rise-query.js +3 -2
  893. package/dist/systems/stair/stair-rise.d.ts.map +1 -1
  894. package/dist/systems/stair/stair-rise.js +6 -0
  895. package/dist/systems/stair/stair-sizing.d.ts +42 -11
  896. package/dist/systems/stair/stair-sizing.d.ts.map +1 -1
  897. package/dist/systems/stair/stair-sizing.js +10 -1
  898. package/dist/systems/stair/stair-structure.d.ts +277 -0
  899. package/dist/systems/stair/stair-structure.d.ts.map +1 -0
  900. package/dist/systems/stair/stair-structure.js +496 -0
  901. package/dist/systems/wall/wall-assembly.d.ts +84 -6
  902. package/dist/systems/wall/wall-assembly.d.ts.map +1 -1
  903. package/dist/systems/wall/wall-assembly.js +204 -5
  904. package/dist/systems/wall/wall-finish.d.ts +38 -2
  905. package/dist/systems/wall/wall-finish.d.ts.map +1 -1
  906. package/dist/systems/wall/wall-finish.js +70 -2
  907. package/dist/systems/wall/wall-footprint.js +2 -2
  908. package/dist/systems/wall/wall-merge.d.ts.map +1 -1
  909. package/dist/systems/wall/wall-merge.js +28 -7
  910. package/dist/systems/wall/wall-mitering.d.ts +1 -0
  911. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  912. package/dist/systems/wall/wall-mitering.js +152 -52
  913. package/dist/systems/wall/wall-move.d.ts +23 -6
  914. package/dist/systems/wall/wall-move.d.ts.map +1 -1
  915. package/dist/systems/wall/wall-move.js +65 -0
  916. package/dist/systems/wall/wall-top.d.ts +2 -2
  917. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  918. package/dist/systems/wall/wall-top.js +6 -1
  919. package/dist/systems/wall/wall-topology.d.ts +32 -1
  920. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  921. package/dist/systems/wall/wall-topology.js +118 -10
  922. package/dist/systems/wall/wall-trim-profiles.d.ts +12 -0
  923. package/dist/systems/wall/wall-trim-profiles.d.ts.map +1 -0
  924. package/dist/systems/wall/wall-trim-profiles.js +191 -0
  925. package/dist/utils/ensure-scene-openings.d.ts +6523 -4923
  926. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  927. package/dist/utils/floor-piece-adoption.d.ts +5 -0
  928. package/dist/utils/floor-piece-adoption.d.ts.map +1 -1
  929. package/dist/utils/floor-plate-migration.d.ts +1930 -1130
  930. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  931. package/dist/utils/owned-floor-opening-migration.d.ts +888 -88
  932. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  933. package/dist/utils/reconcile-structure-on-load.d.ts +1930 -1130
  934. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  935. package/dist/utils/structure-id.d.ts.map +1 -1
  936. package/dist/utils/structure-id.js +4 -0
  937. package/package.json +22 -5
  938. package/dist/lib/generic-foundation.d.ts +0 -40
  939. package/dist/lib/generic-foundation.d.ts.map +0 -1
  940. package/dist/lib/generic-foundation.js +0 -200
@@ -0,0 +1,229 @@
1
+ import { getLevelDisplayName } from '../lib/level-name.js';
2
+ import { resolveWallExteriorSide, wallAssemblyExposedStructure, wallAssemblyFinishRef, } from '../systems/wall/wall-assembly.js';
3
+ import { getWallCurveFrameAt, isCurvedWall } from '../systems/wall/wall-curve.js';
4
+ import { describeWallFaceFinishes, getWallLevelZones, getWallZoneSpans, } from '../systems/wall/wall-finish.js';
5
+ import { calculateLevelMiters, DEFAULT_WALL_HEIGHT, getWallPlanFootprint, } from '../systems/wall/wall-footprint.js';
6
+ import { getWallFaceOffsets } from '../systems/wall/wall-frame.js';
7
+ import { distanceToSegment, pointInPolygon } from './plan-geometry.js';
8
+ import { levelRole, levelsOf, nodesOnLevel } from './scene-queries.js';
9
+ /** A default stretch shorter than this is a sliver at a join, not a face. */
10
+ const MIN_STRETCH_M = 0.1;
11
+ /** A point of a face this far inside another wall's outline is in its body; closer is on its surface. */
12
+ const BURIED_MARGIN_M = 0.01;
13
+ /** How far in front of a face a probe looks for the room it stands in. */
14
+ const LOOK_AHEAD_M = 0.05;
15
+ /** Another wall buries a face only when it is not lower than the wall by more than this. */
16
+ const HEIGHT_SLACK_M = 0.05;
17
+ const length = (stretches) => stretches.reduce((sum, [u0, u1]) => sum + u1 - u0, 0);
18
+ function merged(intervals) {
19
+ const out = [];
20
+ for (const [u0, u1] of [...intervals].sort((p, q) => p[0] - q[0])) {
21
+ const last = out.at(-1);
22
+ if (last && u0 <= last[1] + 1e-9)
23
+ last[1] = Math.max(last[1], u1);
24
+ else
25
+ out.push([u0, u1]);
26
+ }
27
+ return out;
28
+ }
29
+ /** `from` less every `cut`, as intervals longer than `MIN_STRETCH_M`. */
30
+ function subtract(from, cut) {
31
+ const holes = merged(cut);
32
+ const out = [];
33
+ for (const [a, b] of from) {
34
+ let reach = a;
35
+ for (const [h0, h1] of holes) {
36
+ if (h1 <= reach || h0 >= b)
37
+ continue;
38
+ if (h0 > reach)
39
+ out.push([reach, h0]);
40
+ reach = Math.max(reach, h1);
41
+ }
42
+ if (reach < b)
43
+ out.push([reach, b]);
44
+ }
45
+ return out.filter(([u0, u1]) => u1 - u0 >= MIN_STRETCH_M);
46
+ }
47
+ function bodiesOf(walls) {
48
+ const usable = walls.filter((wall) => Array.isArray(wall.start) &&
49
+ Array.isArray(wall.end) &&
50
+ wall.wallType !== 'curtain' &&
51
+ wall.visible !== false);
52
+ let miters;
53
+ try {
54
+ miters = calculateLevelMiters(usable);
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ return usable.flatMap((wall) => {
60
+ const ring = getWallPlanFootprint(wall, miters).map((point) => [point.x, point.y]);
61
+ if (ring.length < 3)
62
+ return [];
63
+ const xs = ring.map(([x]) => x);
64
+ const zs = ring.map(([, z]) => z);
65
+ return [
66
+ { wall, ring, bounds: [Math.min(...xs), Math.min(...zs), Math.max(...xs), Math.max(...zs)] },
67
+ ];
68
+ });
69
+ }
70
+ const heightOf = (wall) => wall.height ?? DEFAULT_WALL_HEIGHT;
71
+ /** Whether a point is in a ring's body: inside it and more than `BURIED_MARGIN_M` from its surface. */
72
+ function inBody(point, ring) {
73
+ if (!pointInPolygon(point, [...ring], false))
74
+ return false;
75
+ for (let index = 0; index < ring.length; index += 1)
76
+ if (distanceToSegment(point, ring[index], ring[(index + 1) % ring.length]) < BURIED_MARGIN_M)
77
+ return false;
78
+ return true;
79
+ }
80
+ /**
81
+ * The stretches of a straight wall's face line (metres along the wall) that lie inside the body of
82
+ * another wall of the level, one at least as high: a face there is covered, not seen.
83
+ */
84
+ function buriedStretches(wall, offset, bodies) {
85
+ const dx = wall.end[0] - wall.start[0];
86
+ const dz = wall.end[1] - wall.start[1];
87
+ const run = Math.hypot(dx, dz);
88
+ if (run < 1e-9)
89
+ return [];
90
+ const nx = -dz / run;
91
+ const nz = dx / run;
92
+ const p0 = [wall.start[0] + nx * offset, wall.start[1] + nz * offset];
93
+ const d = [dx, dz];
94
+ const box = [
95
+ Math.min(p0[0], p0[0] + dx),
96
+ Math.min(p0[1], p0[1] + dz),
97
+ Math.max(p0[0], p0[0] + dx),
98
+ Math.max(p0[1], p0[1] + dz),
99
+ ];
100
+ const cross = (ax, ay, bx, by) => ax * by - ay * bx;
101
+ const buried = [];
102
+ for (const body of bodies) {
103
+ if (body.wall.id === wall.id || heightOf(body.wall) < heightOf(wall) - HEIGHT_SLACK_M)
104
+ continue;
105
+ const [x0, z0, x1, z1] = body.bounds;
106
+ if (x1 < box[0] - BURIED_MARGIN_M || x0 > box[2] + BURIED_MARGIN_M)
107
+ continue;
108
+ if (z1 < box[1] - BURIED_MARGIN_M || z0 > box[3] + BURIED_MARGIN_M)
109
+ continue;
110
+ const cuts = [0, 1];
111
+ for (let index = 0; index < body.ring.length; index += 1) {
112
+ const q0 = body.ring[index];
113
+ const q1 = body.ring[(index + 1) % body.ring.length];
114
+ const e = [q1[0] - q0[0], q1[1] - q0[1]];
115
+ const denominator = cross(d[0], d[1], e[0], e[1]);
116
+ if (Math.abs(denominator) < 1e-12)
117
+ continue;
118
+ const w = [q0[0] - p0[0], q0[1] - p0[1]];
119
+ const t = cross(w[0], w[1], e[0], e[1]) / denominator;
120
+ const s = cross(w[0], w[1], d[0], d[1]) / denominator;
121
+ if (s >= 0 && s <= 1 && t > 0 && t < 1)
122
+ cuts.push(t);
123
+ }
124
+ cuts.sort((p, q) => p - q);
125
+ for (let index = 0; index + 1 < cuts.length; index += 1) {
126
+ const [t0, t1] = [cuts[index], cuts[index + 1]];
127
+ if ((t1 - t0) * run < 1e-4)
128
+ continue;
129
+ const middle = [p0[0] + d[0] * ((t0 + t1) / 2), p0[1] + d[1] * ((t0 + t1) / 2)];
130
+ if (inBody(middle, body.ring))
131
+ buried.push([t0 * run, t1 * run]);
132
+ }
133
+ }
134
+ return merged(buried);
135
+ }
136
+ const rounded = (value) => Math.round(value * 100) / 100;
137
+ function pointAlong(wall, u) {
138
+ const run = Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
139
+ const { point } = getWallCurveFrameAt(wall, run > 0 ? u / run : 0);
140
+ return [rounded(point.x), rounded(point.y)];
141
+ }
142
+ const FACES = ['a', 'b'];
143
+ /**
144
+ * Every wall face of the scene read for the default finish. Walls that are hidden, curtain walls and
145
+ * walls on a roof level are left out; a scene whose walls cannot be walked reads as no faces.
146
+ */
147
+ export function readWallFaces(nodes) {
148
+ const reading = { faces: 0, metres: 0, defaults: [] };
149
+ for (const level of levelsOf(nodes)) {
150
+ if (levelRole(nodes, level).role === 'roof')
151
+ continue;
152
+ const walls = nodesOnLevel(nodes, level.id).filter((node) => node.type === 'wall' &&
153
+ node.visible !== false &&
154
+ node.wallType !== 'curtain' &&
155
+ Array.isArray(node.start) &&
156
+ Array.isArray(node.end));
157
+ if (!walls.length)
158
+ continue;
159
+ const bodies = bodiesOf(walls);
160
+ const rooms = getWallLevelZones({ parentId: level.id }, nodes).filter((zone) => zone.spaceRole === 'room' && zone.polygon.length >= 3);
161
+ const levelName = getLevelDisplayName(level);
162
+ for (const wall of walls) {
163
+ const run = Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
164
+ if (run < MIN_STRETCH_M)
165
+ continue;
166
+ const finishes = describeWallFaceFinishes(wall, nodes);
167
+ const offsets = getWallFaceOffsets(wall);
168
+ const spans = getWallZoneSpans(wall, rooms);
169
+ const exteriorSide = resolveWallExteriorSide(wall);
170
+ const clad = wallAssemblyFinishRef(wall) !== null || wallAssemblyExposedStructure(wall) !== null;
171
+ for (const face of FACES) {
172
+ const buried = isCurvedWall(wall) ? [] : buriedStretches(wall, offsets[face], bodies);
173
+ const visible = subtract([[0, run]], buried);
174
+ const seen = length(visible);
175
+ if (seen < MIN_STRETCH_M)
176
+ continue;
177
+ reading.faces += 1;
178
+ reading.metres += seen;
179
+ const written = wall.finishScripts?.[face] !== undefined ||
180
+ (clad && exteriorSide !== null && (exteriorSide === 1 ? 'a' : 'b') === face);
181
+ if (written)
182
+ continue;
183
+ const own = finishes[face].stretches
184
+ .filter((stretch) => stretch.source === 'wall_face' && stretch.chain === 'default')
185
+ .map((stretch) => [stretch.u0, stretch.u1]);
186
+ const painted = finishes[face].paintRegions.map((region) => [region.u0 ?? 0, region.u1 ?? run]);
187
+ const stretches = subtract(subtract(own, painted), buried);
188
+ if (!stretches.length)
189
+ continue;
190
+ const first = stretches[0][0];
191
+ const last = stretches.at(-1)[1];
192
+ const faceSpans = spans.filter((span) => span.face === face &&
193
+ stretches.some(([u0, u1]) => span.t1 * run > u0 + 0.02 && span.t0 * run < u1 - 0.02));
194
+ const facing = [...new Set(faceSpans.map((span) => nodes[span.zoneId].name))];
195
+ const standsIn = facing.length
196
+ ? []
197
+ : roomsStoodIn(wall, face, offsets[face], stretches, rooms);
198
+ reading.defaults.push({
199
+ wallId: wall.id,
200
+ wallName: wall.name ?? wall.id,
201
+ levelId: level.id,
202
+ levelName,
203
+ face,
204
+ metres: length(stretches),
205
+ stretches,
206
+ from: pointAlong(wall, first),
207
+ to: pointAlong(wall, last),
208
+ facing,
209
+ standsIn,
210
+ });
211
+ }
212
+ }
213
+ }
214
+ return reading;
215
+ }
216
+ /** The rooms a probe a little in front of the stretches' middle lies in. */
217
+ function roomsStoodIn(wall, face, offset, stretches, rooms) {
218
+ const widest = [...stretches].sort((p, q) => q[1] - q[0] - (p[1] - p[0]))[0];
219
+ const run = Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
220
+ const dx = wall.end[0] - wall.start[0];
221
+ const dz = wall.end[1] - wall.start[1];
222
+ const [x, z] = pointAlong(wall, (widest[0] + widest[1]) / 2);
223
+ const ahead = offset + (face === 'a' ? LOOK_AHEAD_M : -LOOK_AHEAD_M);
224
+ const probe = [x + (-dz / run) * ahead, z + (dx / run) * ahead];
225
+ return rooms
226
+ .filter((zone) => pointInPolygon(probe, zone.polygon) &&
227
+ !(zone.holes ?? []).some((hole) => pointInPolygon(probe, hole, false)))
228
+ .map((zone) => zone.name);
229
+ }
@@ -0,0 +1,119 @@
1
+ import type { AnyNode } from '../schema/index.js';
2
+ /**
3
+ * Two facts about where straight walls of one level meet, for `verify_scene`:
4
+ *
5
+ * - `wall_end_short`: a wall end that stops short of another wall's body, leaving daylight
6
+ * between them. The room graph (`wall_open_end`) elects an end within 8 cm of a body as joined
7
+ * and says nothing of it; the floor, the finish and the render show the slot.
8
+ * - `wall_nearly_aligned`: a wall that continues another a few degrees off its axis, or sits
9
+ * between two aligned walls a few degrees off their line (a short wall holding a door,
10
+ * drawn skewed). A wall angled by design turns more than this and does not qualify.
11
+ *
12
+ * Measured on the walls' bodies (the stored line shifted by the justification, a thickness wide),
13
+ * straight walls only: a curved wall has no single axis and no single end cap.
14
+ */
15
+ type WallNode = AnyNode & {
16
+ type: 'wall';
17
+ };
18
+ type Pt = readonly [number, number];
19
+ /** An end that stops this far short of a body or more is a gap; nearer is a joint. */
20
+ export declare const END_SHORT_MIN_M = 0.03;
21
+ /** Further than this the end is a free end that happens to stand near a wall, not a missed joint. */
22
+ export declare const END_SHORT_MAX_M = 0.25;
23
+ /** A turn smaller than this is a straight line drawn with noise; a larger one up to the maximum is the finding. */
24
+ export declare const ALIGN_MIN_DEG = 0.5;
25
+ /** A turn larger than this is an angle somebody drew (a bay, an angled wing). */
26
+ export declare const ALIGN_MAX_DEG = 6;
27
+ /** A skew that moves the wall's far end less than this off its neighbour's line is within drawing tolerance, and is not said. */
28
+ export declare const ALIGN_MIN_OFFSET_M = 0.02;
29
+ export type WallBody = {
30
+ id: string;
31
+ name: string;
32
+ /** The body's centre line, start to end. */
33
+ a: Pt;
34
+ b: Pt;
35
+ length: number;
36
+ /** Unit direction a to b. */
37
+ ux: number;
38
+ uy: number;
39
+ thickness: number;
40
+ };
41
+ export type WallEndShortIssue = {
42
+ type: 'wall_end_short';
43
+ message: string;
44
+ severity: 'warning';
45
+ levelId: string;
46
+ wallId: string;
47
+ wallName: string;
48
+ end: 'start' | 'end';
49
+ otherWallId: string;
50
+ otherWallName: string;
51
+ /** Daylight between the end and the other wall's body, in metres. */
52
+ gap: number;
53
+ /** Where the end is, [x, z]. */
54
+ at: [number, number];
55
+ nodeIds: [string, string];
56
+ };
57
+ export type WallNearlyAlignedIssue = {
58
+ type: 'wall_nearly_aligned';
59
+ message: string;
60
+ severity: 'warning';
61
+ levelId: string;
62
+ wallId: string;
63
+ wallName: string;
64
+ /** The largest angle between the wall's axis and a neighbour's, in degrees. */
65
+ angle: number;
66
+ /** How far the wall's far end stands off the neighbour's line, in metres. */
67
+ offset: number;
68
+ neighbours: {
69
+ wallId: string;
70
+ name: string;
71
+ end: 'start' | 'end';
72
+ angle: number;
73
+ }[];
74
+ nodeIds: string[];
75
+ };
76
+ /** The straight, visible walls long enough to measure, as bodies. */
77
+ export declare function wallBodies(walls: readonly WallNode[]): WallBody[];
78
+ /**
79
+ * Wall ends that stop 3 to 25 cm short of another wall of the level: the daylight between the
80
+ * end's cap and the other wall's body, the other wall named. An end that touches any wall (the
81
+ * caps and bodies within 3 cm) is a joint and is not asked; so is an end whose nearest wall lies
82
+ * to its side, not ahead of it (two walls running side by side).
83
+ */
84
+ export declare function wallEndShortIssues(input: {
85
+ levelId: string;
86
+ levelName: string;
87
+ bodies: readonly WallBody[];
88
+ min?: number;
89
+ max?: number;
90
+ }): WallEndShortIssue[];
91
+ export type Bend = {
92
+ wall: WallBody;
93
+ end: 'start' | 'end';
94
+ other: WallBody;
95
+ otherEnd: 'start' | 'end';
96
+ angle: number;
97
+ };
98
+ /**
99
+ * Every place one wall carries on into another: the two bodies' ends within a wall thickness of
100
+ * each other, and the second heading away from the joint within `maxDeg` of the first's heading.
101
+ * The angle is the turn between them (0 is one straight line).
102
+ */
103
+ export declare function wallContinuations(bodies: readonly WallBody[], maxDeg: number): Bend[];
104
+ /**
105
+ * A wall that continues another at an angle between 0.5 and 6 degrees: joined at an end and
106
+ * carrying on in nearly the same direction. A wall between two neighbours that are aligned with
107
+ * each other is the one reported (the short wall holding a door, drawn skewed), with both
108
+ * neighbours; a single bend is reported on the shorter of its two walls.
109
+ */
110
+ export declare function wallNearlyAlignedIssues(input: {
111
+ levelId: string;
112
+ levelName: string;
113
+ bodies: readonly WallBody[];
114
+ min?: number;
115
+ max?: number;
116
+ minOffset?: number;
117
+ }): WallNearlyAlignedIssue[];
118
+ export {};
119
+ //# sourceMappingURL=wall-joins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-joins.d.ts","sourceRoot":"","sources":["../../src/agent-operations/wall-joins.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC;;;;;;;;;;;;GAYG;AAEH,KAAK,QAAQ,GAAG,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAC1C,KAAK,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEnC,sFAAsF;AACtF,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,qGAAqG;AACrG,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,mHAAmH;AACnH,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,iFAAiF;AACjF,eAAO,MAAM,aAAa,IAAI,CAAA;AAC9B,iIAAiI;AACjI,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAQtC,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,CAAC,EAAE,EAAE,CAAA;IACL,CAAC,EAAE,EAAE,CAAA;IACL,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,OAAO,GAAG,KAAK,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,SAAS,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACnF,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB,CAAA;AAKD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAqBjE;AA4FD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,GAAG,iBAAiB,EAAE,CA8CtB;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,OAAO,GAAG,KAAK,CAAA;IACpB,KAAK,EAAE,QAAQ,CAAA;IACf,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AASD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAqBrF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,sBAAsB,EAAE,CAyE3B"}
@@ -0,0 +1,308 @@
1
+ import { isCurvedWall } from '../systems/wall/wall-curve.js';
2
+ import { getWallBodyLine } from '../systems/wall/wall-frame.js';
3
+ /** An end that stops this far short of a body or more is a gap; nearer is a joint. */
4
+ export const END_SHORT_MIN_M = 0.03;
5
+ /** Further than this the end is a free end that happens to stand near a wall, not a missed joint. */
6
+ export const END_SHORT_MAX_M = 0.25;
7
+ /** A turn smaller than this is a straight line drawn with noise; a larger one up to the maximum is the finding. */
8
+ export const ALIGN_MIN_DEG = 0.5;
9
+ /** A turn larger than this is an angle somebody drew (a bay, an angled wing). */
10
+ export const ALIGN_MAX_DEG = 6;
11
+ /** A skew that moves the wall's far end less than this off its neighbour's line is within drawing tolerance, and is not said. */
12
+ export const ALIGN_MIN_OFFSET_M = 0.02;
13
+ /** The two neighbours of a wall count as aligned with each other within this. */
14
+ const NEIGHBOURS_ALIGNED_DEG = 0.5;
15
+ /** Shortest wall that is measured. */
16
+ const MIN_LENGTH_M = 0.05;
17
+ /** The nearest points of two parts of a wall end and a body must lie this far ahead of the end, as a share of the distance (cos of 60 degrees). */
18
+ const AHEAD = 0.5;
19
+ const round = (value, places) => Math.round(value * 10 ** places) / 10 ** places;
20
+ const nameOf = (wall) => wall.name?.trim() || wall.id;
21
+ /** The straight, visible walls long enough to measure, as bodies. */
22
+ export function wallBodies(walls) {
23
+ const bodies = [];
24
+ for (const wall of walls) {
25
+ if (wall.visible === false || isCurvedWall(wall))
26
+ continue;
27
+ const line = getWallBodyLine(wall);
28
+ const dx = line.end.x - line.start.x;
29
+ const dy = line.end.y - line.start.y;
30
+ const length = Math.hypot(dx, dy);
31
+ if (!(length >= MIN_LENGTH_M) || !Number.isFinite(length))
32
+ continue;
33
+ bodies.push({
34
+ id: wall.id,
35
+ name: nameOf(wall),
36
+ a: [line.start.x, line.start.y],
37
+ b: [line.end.x, line.end.y],
38
+ length,
39
+ ux: dx / length,
40
+ uy: dy / length,
41
+ thickness: wall.thickness ?? 0.1,
42
+ });
43
+ }
44
+ return bodies.sort((p, q) => (p.id < q.id ? -1 : 1));
45
+ }
46
+ const dot = (ax, ay, bx, by) => ax * bx + ay * by;
47
+ /** The closest points of two segments and their distance (0 where they cross). */
48
+ function closestOfSegments(p1, p2, q1, q2) {
49
+ const d1x = p2[0] - p1[0];
50
+ const d1y = p2[1] - p1[1];
51
+ const d2x = q2[0] - q1[0];
52
+ const d2y = q2[1] - q1[1];
53
+ const rx = p1[0] - q1[0];
54
+ const ry = p1[1] - q1[1];
55
+ const a = dot(d1x, d1y, d1x, d1y);
56
+ const e = dot(d2x, d2y, d2x, d2y);
57
+ const f = dot(d2x, d2y, rx, ry);
58
+ let s;
59
+ let t;
60
+ if (a <= 1e-12 && e <= 1e-12) {
61
+ s = 0;
62
+ t = 0;
63
+ }
64
+ else if (a <= 1e-12) {
65
+ s = 0;
66
+ t = Math.min(1, Math.max(0, f / e));
67
+ }
68
+ else {
69
+ const c = dot(d1x, d1y, rx, ry);
70
+ if (e <= 1e-12) {
71
+ t = 0;
72
+ s = Math.min(1, Math.max(0, -c / a));
73
+ }
74
+ else {
75
+ const b = dot(d1x, d1y, d2x, d2y);
76
+ const denom = a * e - b * b;
77
+ s = denom > 1e-12 ? Math.min(1, Math.max(0, (b * f - c * e) / denom)) : 0;
78
+ t = (b * s + f) / e;
79
+ if (t < 0) {
80
+ t = 0;
81
+ s = Math.min(1, Math.max(0, -c / a));
82
+ }
83
+ else if (t > 1) {
84
+ t = 1;
85
+ s = Math.min(1, Math.max(0, (b - c) / a));
86
+ }
87
+ }
88
+ }
89
+ const p = [p1[0] + d1x * s, p1[1] + d1y * s];
90
+ const q = [q1[0] + d2x * t, q1[1] + d2y * t];
91
+ return { d: Math.hypot(p[0] - q[0], p[1] - q[1]), p, q };
92
+ }
93
+ /** The four corners of a body, in order. */
94
+ function corners(body) {
95
+ const nx = -body.uy * (body.thickness / 2);
96
+ const ny = body.ux * (body.thickness / 2);
97
+ return [
98
+ [body.a[0] + nx, body.a[1] + ny],
99
+ [body.b[0] + nx, body.b[1] + ny],
100
+ [body.b[0] - nx, body.b[1] - ny],
101
+ [body.a[0] - nx, body.a[1] - ny],
102
+ ];
103
+ }
104
+ function insideRectangle(point, rectangle) {
105
+ let sign = 0;
106
+ for (let i = 0; i < 4; i++) {
107
+ const from = rectangle[i];
108
+ const to = rectangle[(i + 1) % 4];
109
+ const cross = (to[0] - from[0]) * (point[1] - from[1]) - (to[1] - from[1]) * (point[0] - from[0]);
110
+ if (Math.abs(cross) < 1e-12)
111
+ continue;
112
+ const s = Math.sign(cross);
113
+ if (sign === 0)
114
+ sign = s;
115
+ else if (s !== sign)
116
+ return false;
117
+ }
118
+ return true;
119
+ }
120
+ /** The closest points of a segment and a body's rectangle; 0 apart where they touch or overlap. */
121
+ function closestToBody(c1, c2, body) {
122
+ const rectangle = corners(body);
123
+ if (insideRectangle(c1, rectangle))
124
+ return { d: 0, p: c1, q: c1 };
125
+ if (insideRectangle(c2, rectangle))
126
+ return { d: 0, p: c2, q: c2 };
127
+ let best = { d: Number.POSITIVE_INFINITY, p: c1, q: c1 };
128
+ for (let i = 0; i < 4; i++) {
129
+ const hit = closestOfSegments(c1, c2, rectangle[i], rectangle[(i + 1) % 4]);
130
+ if (hit.d < best.d)
131
+ best = hit;
132
+ }
133
+ return best;
134
+ }
135
+ const endPoint = (body, end) => (end === 'start' ? body.a : body.b);
136
+ /** The unit direction pointing out of the wall at an end. */
137
+ const outward = (body, end) => end === 'start' ? [-body.ux, -body.uy] : [body.ux, body.uy];
138
+ /**
139
+ * Wall ends that stop 3 to 25 cm short of another wall of the level: the daylight between the
140
+ * end's cap and the other wall's body, the other wall named. An end that touches any wall (the
141
+ * caps and bodies within 3 cm) is a joint and is not asked; so is an end whose nearest wall lies
142
+ * to its side, not ahead of it (two walls running side by side).
143
+ */
144
+ export function wallEndShortIssues(input) {
145
+ const min = input.min ?? END_SHORT_MIN_M;
146
+ const max = input.max ?? END_SHORT_MAX_M;
147
+ const issues = [];
148
+ for (const wall of input.bodies) {
149
+ for (const end of ['start', 'end']) {
150
+ const e = endPoint(wall, end);
151
+ const [ox, oy] = outward(wall, end);
152
+ const half = wall.thickness / 2;
153
+ const cap1 = [e[0] - oy * half, e[1] + ox * half];
154
+ const cap2 = [e[0] + oy * half, e[1] - ox * half];
155
+ let touching = false;
156
+ let nearest;
157
+ for (const other of input.bodies) {
158
+ if (other.id === wall.id)
159
+ continue;
160
+ const hit = closestToBody(cap1, cap2, other);
161
+ if (hit.d < min) {
162
+ touching = true;
163
+ break;
164
+ }
165
+ if (hit.d > max)
166
+ continue;
167
+ const vx = hit.q[0] - hit.p[0];
168
+ const vy = hit.q[1] - hit.p[1];
169
+ if (dot(vx, vy, ox, oy) < AHEAD * hit.d)
170
+ continue;
171
+ if (!nearest || hit.d < nearest.d)
172
+ nearest = { other, d: hit.d };
173
+ }
174
+ if (touching || !nearest)
175
+ continue;
176
+ const gap = round(nearest.d, 3);
177
+ const cm = (gap * 100).toFixed(1);
178
+ issues.push({
179
+ type: 'wall_end_short',
180
+ severity: 'warning',
181
+ levelId: input.levelId,
182
+ wallId: wall.id,
183
+ wallName: wall.name,
184
+ end,
185
+ otherWallId: nearest.other.id,
186
+ otherWallName: nearest.other.name,
187
+ gap,
188
+ at: [round(e[0], 3), round(e[1], 3)],
189
+ nodeIds: [wall.id, nearest.other.id],
190
+ message: `On ${input.levelName}, ${wall.name} (${wall.id}) ${end} stops ${cm} cm short of ${nearest.other.name} (${nearest.other.id}) at (${e[0].toFixed(2)}, ${e[1].toFixed(2)}): ${cm} cm of daylight between them (asked for a gap of ${min * 100}-${max * 100} cm; a joint is closer, a free end further)`,
191
+ });
192
+ }
193
+ }
194
+ return issues;
195
+ }
196
+ const degrees = (radians) => (radians * 180) / Math.PI;
197
+ const angleBetween = (ax, ay, bx, by) => degrees(Math.acos(Math.min(1, Math.max(-1, dot(ax, ay, bx, by)))));
198
+ /** Distance from a point to the infinite line of a body. */
199
+ const offLine = (point, body) => Math.abs((point[0] - body.a[0]) * body.uy - (point[1] - body.a[1]) * body.ux);
200
+ /**
201
+ * Every place one wall carries on into another: the two bodies' ends within a wall thickness of
202
+ * each other, and the second heading away from the joint within `maxDeg` of the first's heading.
203
+ * The angle is the turn between them (0 is one straight line).
204
+ */
205
+ export function wallContinuations(bodies, maxDeg) {
206
+ const bends = [];
207
+ for (const wall of bodies) {
208
+ for (const end of ['start', 'end']) {
209
+ const e = endPoint(wall, end);
210
+ const [ox, oy] = outward(wall, end);
211
+ for (const other of bodies) {
212
+ if (other.id === wall.id)
213
+ continue;
214
+ for (const otherEnd of ['start', 'end']) {
215
+ const f = endPoint(other, otherEnd);
216
+ if (Math.hypot(e[0] - f[0], e[1] - f[1]) > Math.max(wall.thickness, other.thickness))
217
+ continue;
218
+ // the direction the other wall takes away from the joint
219
+ const [dx, dy] = outward(other, otherEnd === 'start' ? 'end' : 'start');
220
+ const angle = angleBetween(ox, oy, dx, dy);
221
+ if (angle <= maxDeg)
222
+ bends.push({ wall, end, other, otherEnd, angle });
223
+ }
224
+ }
225
+ }
226
+ }
227
+ return bends;
228
+ }
229
+ /**
230
+ * A wall that continues another at an angle between 0.5 and 6 degrees: joined at an end and
231
+ * carrying on in nearly the same direction. A wall between two neighbours that are aligned with
232
+ * each other is the one reported (the short wall holding a door, drawn skewed), with both
233
+ * neighbours; a single bend is reported on the shorter of its two walls.
234
+ */
235
+ export function wallNearlyAlignedIssues(input) {
236
+ const min = input.min ?? ALIGN_MIN_DEG;
237
+ const max = input.max ?? ALIGN_MAX_DEG;
238
+ const minOffset = input.minOffset ?? ALIGN_MIN_OFFSET_M;
239
+ const bends = wallContinuations(input.bodies, max).filter((bend) => bend.angle >= min);
240
+ const byWall = new Map();
241
+ for (const bend of bends)
242
+ byWall.set(bend.wall.id, [...(byWall.get(bend.wall.id) ?? []), bend]);
243
+ const issues = [];
244
+ const covered = new Set();
245
+ const neighbourOf = (bend) => ({
246
+ wallId: bend.other.id,
247
+ name: bend.other.name,
248
+ end: bend.end,
249
+ angle: round(bend.angle, 1),
250
+ });
251
+ const issue = (wall, own, offset) => {
252
+ const angle = round(Math.max(...own.map((bend) => bend.angle)), 1);
253
+ const neighbours = own.map(neighbourOf);
254
+ return {
255
+ type: 'wall_nearly_aligned',
256
+ severity: 'warning',
257
+ levelId: input.levelId,
258
+ wallId: wall.id,
259
+ wallName: wall.name,
260
+ angle,
261
+ offset: round(offset, 3),
262
+ neighbours,
263
+ nodeIds: [wall.id, ...own.map((bend) => bend.other.id)],
264
+ message: `On ${input.levelName}, ${wall.name} (${wall.id}) lies ${angle.toFixed(1)}° off the axis of ${neighbours
265
+ .map((n) => `${n.name} (${n.wallId}) at its ${n.end} (${n.angle.toFixed(1)}°)`)
266
+ .join(' and ')}; its far end stands ${(offset * 100).toFixed(1)} cm off that line (asked for a turn of ${min}-${max}° that moves the far end 2 cm or more: a straighter line is one line, a larger turn is an angle drawn on purpose)`,
267
+ };
268
+ };
269
+ // a wall between two neighbours aligned with each other: the skewed one
270
+ for (const [id, own] of byWall) {
271
+ const wall = own[0].wall;
272
+ const starts = own.filter((bend) => bend.end === 'start');
273
+ const ends = own.filter((bend) => bend.end === 'end');
274
+ if (!starts.length || !ends.length)
275
+ continue;
276
+ for (const first of starts) {
277
+ for (const second of ends) {
278
+ const between = angleBetween(first.other.ux, first.other.uy, second.other.ux, second.other.uy);
279
+ const aligned = Math.min(between, 180 - between) < NEIGHBOURS_ALIGNED_DEG;
280
+ if (!aligned || covered.has(id))
281
+ continue;
282
+ covered.add(id);
283
+ const offset = Math.max(offLine(wall.a, first.other), offLine(wall.b, first.other));
284
+ if (offset >= minOffset)
285
+ issues.push(issue(wall, [first, second], offset));
286
+ }
287
+ }
288
+ }
289
+ // a single bend: the shorter wall carries it, once
290
+ const reported = new Set();
291
+ for (const bend of bends) {
292
+ if (covered.has(bend.wall.id) || covered.has(bend.other.id))
293
+ continue;
294
+ const shorter = bend.wall.length < bend.other.length ||
295
+ (bend.wall.length === bend.other.length && bend.wall.id < bend.other.id);
296
+ if (!shorter)
297
+ continue;
298
+ const key = [bend.wall.id, bend.other.id].sort().join('|');
299
+ if (reported.has(key))
300
+ continue;
301
+ reported.add(key);
302
+ const far = bend.end === 'start' ? bend.wall.b : bend.wall.a;
303
+ const offset = offLine(far, bend.other);
304
+ if (offset >= minOffset)
305
+ issues.push(issue(bend.wall, [bend], offset));
306
+ }
307
+ return issues.sort((a, b) => (a.wallId < b.wallId ? -1 : 1));
308
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"wall-object-observations.d.ts","sourceRoot":"","sources":["../../src/agent-operations/wall-object-observations.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,wBAAwB,CAAA;AAQ/B,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,WAAW,CAAA;AAI5D,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AACpC,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAA;AAC3E,+FAA+F;AAC/F,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,EAAE,CAAA;CAAE,CAAA;AAC7E,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,eAAe,EAAE,UAAU,CAAA;IAC3B,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAA;IACjC,QAAQ,EAAE,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;CACvF,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG;IAC7C,IAAI,EACA,wBAAwB,GACxB,mBAAmB,GACnB,iBAAiB,GACjB,yBAAyB,GACzB,gCAAgC,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAiID,4GAA4G;AAC5G,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAM,GAC1D,qBAAqB,EAAE,CAoJzB"}
1
+ {"version":3,"file":"wall-object-observations.d.ts","sourceRoot":"","sources":["../../src/agent-operations/wall-object-observations.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,IAAI,EAEV,MAAM,wBAAwB,CAAA;AAQ/B,OAAO,KAAK,EAAE,OAAO,EAAsB,MAAM,WAAW,CAAA;AAK5D,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AACpC,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAA;AAC3E,+FAA+F;AAC/F,MAAM,MAAM,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAAC,KAAK,EAAE,cAAc,EAAE,CAAA;CAAE,CAAA;AAC7E,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,eAAe,EAAE,UAAU,CAAA;IAC3B,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAA;IACjC,QAAQ,EAAE,eAAe,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;CACvF,CAAA;AACD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG;IAC7C,IAAI,EACA,wBAAwB,GACxB,mBAAmB,GACnB,iBAAiB,GACjB,yBAAyB,GACzB,gCAAgC,CAAA;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAgID,4GAA4G;AAC5G,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACxC,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAM,GAC1D,qBAAqB,EAAE,CAmJzB"}