@pascal-app/core 1.0.4 → 1.0.6

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 (866) hide show
  1. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts +102 -90
  2. package/dist/agent-operations/__fixtures__/add-object-cases.d.ts.map +1 -1
  3. package/dist/agent-operations/__fixtures__/add-object-cases.js +301 -1
  4. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts +3 -0
  5. package/dist/agent-operations/__fixtures__/add-stair-cases.d.ts.map +1 -0
  6. package/dist/agent-operations/__fixtures__/add-stair-cases.js +176 -0
  7. package/dist/agent-operations/__fixtures__/build-room-cases.d.ts.map +1 -1
  8. package/dist/agent-operations/__fixtures__/build-room-cases.js +410 -40
  9. package/dist/agent-operations/__fixtures__/cases.d.ts +18 -3
  10. package/dist/agent-operations/__fixtures__/cases.d.ts.map +1 -1
  11. package/dist/agent-operations/__fixtures__/cases.js +183 -4
  12. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts +3 -0
  13. package/dist/agent-operations/__fixtures__/corner-window-cases.d.ts.map +1 -0
  14. package/dist/agent-operations/__fixtures__/corner-window-cases.js +155 -0
  15. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts +14 -0
  16. package/dist/agent-operations/__fixtures__/design-brief-cases.d.ts.map +1 -0
  17. package/dist/agent-operations/__fixtures__/design-brief-cases.js +709 -0
  18. package/dist/agent-operations/__fixtures__/finish-cases.d.ts +7 -0
  19. package/dist/agent-operations/__fixtures__/finish-cases.d.ts.map +1 -0
  20. package/dist/agent-operations/__fixtures__/finish-cases.js +758 -0
  21. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts +3 -0
  22. package/dist/agent-operations/__fixtures__/lot-info-cases.d.ts.map +1 -0
  23. package/dist/agent-operations/__fixtures__/lot-info-cases.js +370 -0
  24. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts +3 -0
  25. package/dist/agent-operations/__fixtures__/merge-windows-cases.d.ts.map +1 -0
  26. package/dist/agent-operations/__fixtures__/merge-windows-cases.js +321 -0
  27. package/dist/agent-operations/__fixtures__/native-materials.d.ts +2237 -0
  28. package/dist/agent-operations/__fixtures__/native-materials.d.ts.map +1 -0
  29. package/dist/agent-operations/__fixtures__/native-materials.js +82 -0
  30. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts +4 -0
  31. package/dist/agent-operations/__fixtures__/node-read-cases.d.ts.map +1 -0
  32. package/dist/agent-operations/__fixtures__/node-read-cases.js +639 -0
  33. package/dist/agent-operations/__fixtures__/notation-cases.d.ts +24 -0
  34. package/dist/agent-operations/__fixtures__/notation-cases.d.ts.map +1 -0
  35. package/dist/agent-operations/__fixtures__/notation-cases.js +356 -0
  36. package/dist/agent-operations/__fixtures__/place-items-cases.d.ts.map +1 -1
  37. package/dist/agent-operations/__fixtures__/place-items-cases.js +80 -2
  38. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts +19726 -0
  39. package/dist/agent-operations/__fixtures__/roof-bearing-cases.d.ts.map +1 -0
  40. package/dist/agent-operations/__fixtures__/roof-bearing-cases.js +106 -0
  41. package/dist/agent-operations/__fixtures__/roof-cases.d.ts +9 -0
  42. package/dist/agent-operations/__fixtures__/roof-cases.d.ts.map +1 -0
  43. package/dist/agent-operations/__fixtures__/roof-cases.js +382 -0
  44. package/dist/agent-operations/__fixtures__/room-cases.d.ts +2 -1
  45. package/dist/agent-operations/__fixtures__/room-cases.d.ts.map +1 -1
  46. package/dist/agent-operations/__fixtures__/room-cases.js +136 -1
  47. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts +4 -0
  48. package/dist/agent-operations/__fixtures__/scene-check-cases.d.ts.map +1 -0
  49. package/dist/agent-operations/__fixtures__/scene-check-cases.js +417 -0
  50. package/dist/agent-operations/__fixtures__/search-assets-cases.d.ts.map +1 -1
  51. package/dist/agent-operations/__fixtures__/search-assets-cases.js +15 -3
  52. package/dist/agent-operations/__fixtures__/site-cases.d.ts +290 -0
  53. package/dist/agent-operations/__fixtures__/site-cases.d.ts.map +1 -0
  54. package/dist/agent-operations/__fixtures__/site-cases.js +780 -0
  55. package/dist/agent-operations/__fixtures__/structure-cases.d.ts +1 -0
  56. package/dist/agent-operations/__fixtures__/structure-cases.d.ts.map +1 -1
  57. package/dist/agent-operations/__fixtures__/structure-cases.js +630 -3
  58. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts +311 -1
  59. package/dist/agent-operations/__fixtures__/verify-scene-cases.d.ts.map +1 -1
  60. package/dist/agent-operations/__fixtures__/verify-scene-cases.js +59 -11
  61. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts +3 -0
  62. package/dist/agent-operations/__fixtures__/view-assets-cases.d.ts.map +1 -0
  63. package/dist/agent-operations/__fixtures__/view-assets-cases.js +155 -0
  64. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts +50 -0
  65. package/dist/agent-operations/__fixtures__/view-scene-cases.d.ts.map +1 -0
  66. package/dist/agent-operations/__fixtures__/view-scene-cases.js +425 -0
  67. package/dist/agent-operations/achieved.d.ts +5 -0
  68. package/dist/agent-operations/achieved.d.ts.map +1 -1
  69. package/dist/agent-operations/achieved.js +21 -1
  70. package/dist/agent-operations/add-column.d.ts.map +1 -1
  71. package/dist/agent-operations/add-column.js +3 -1
  72. package/dist/agent-operations/add-fence.d.ts +18 -0
  73. package/dist/agent-operations/add-fence.d.ts.map +1 -0
  74. package/dist/agent-operations/add-fence.js +48 -0
  75. package/dist/agent-operations/add-level.d.ts +4 -1
  76. package/dist/agent-operations/add-level.d.ts.map +1 -1
  77. package/dist/agent-operations/add-level.js +48 -12
  78. package/dist/agent-operations/add-object.d.ts +38 -9
  79. package/dist/agent-operations/add-object.d.ts.map +1 -1
  80. package/dist/agent-operations/add-object.js +172 -11
  81. package/dist/agent-operations/add-wall.d.ts +1 -3
  82. package/dist/agent-operations/add-wall.d.ts.map +1 -1
  83. package/dist/agent-operations/add-wall.js +35 -9
  84. package/dist/agent-operations/apply-changes.d.ts +7 -1
  85. package/dist/agent-operations/apply-changes.d.ts.map +1 -1
  86. package/dist/agent-operations/apply-changes.js +54 -22
  87. package/dist/agent-operations/apply-outcome.d.ts +6 -0
  88. package/dist/agent-operations/apply-outcome.d.ts.map +1 -1
  89. package/dist/agent-operations/apply-outcome.js +23 -8
  90. package/dist/agent-operations/asset-views.d.ts +75 -0
  91. package/dist/agent-operations/asset-views.d.ts.map +1 -0
  92. package/dist/agent-operations/asset-views.js +234 -0
  93. package/dist/agent-operations/author-scene.d.ts +157 -0
  94. package/dist/agent-operations/author-scene.d.ts.map +1 -0
  95. package/dist/agent-operations/author-scene.js +1076 -0
  96. package/dist/agent-operations/authored-scene-merge.d.ts +4 -0
  97. package/dist/agent-operations/authored-scene-merge.d.ts.map +1 -0
  98. package/dist/agent-operations/authored-scene-merge.js +96 -0
  99. package/dist/agent-operations/batch.d.ts +22 -0
  100. package/dist/agent-operations/batch.d.ts.map +1 -0
  101. package/dist/agent-operations/batch.js +104 -0
  102. package/dist/agent-operations/ceiling-object-observations.d.ts +31 -0
  103. package/dist/agent-operations/ceiling-object-observations.d.ts.map +1 -0
  104. package/dist/agent-operations/ceiling-object-observations.js +111 -0
  105. package/dist/agent-operations/corner-window.d.ts +19 -0
  106. package/dist/agent-operations/corner-window.d.ts.map +1 -0
  107. package/dist/agent-operations/corner-window.js +84 -0
  108. package/dist/agent-operations/create-roof.d.ts +32 -0
  109. package/dist/agent-operations/create-roof.d.ts.map +1 -0
  110. package/dist/agent-operations/create-roof.js +304 -0
  111. package/dist/agent-operations/create-room.d.ts +2 -0
  112. package/dist/agent-operations/create-room.d.ts.map +1 -1
  113. package/dist/agent-operations/create-room.js +73 -5
  114. package/dist/agent-operations/create-stair.d.ts +6 -28
  115. package/dist/agent-operations/create-stair.d.ts.map +1 -1
  116. package/dist/agent-operations/create-stair.js +187 -104
  117. package/dist/agent-operations/design-brief.d.ts +38 -0
  118. package/dist/agent-operations/design-brief.d.ts.map +1 -0
  119. package/dist/agent-operations/design-brief.js +300 -0
  120. package/dist/agent-operations/designs.d.ts +24 -0
  121. package/dist/agent-operations/designs.d.ts.map +1 -0
  122. package/dist/agent-operations/designs.js +48 -0
  123. package/dist/agent-operations/door-clearance.d.ts +16 -1
  124. package/dist/agent-operations/door-clearance.d.ts.map +1 -1
  125. package/dist/agent-operations/door-clearance.js +61 -4
  126. package/dist/agent-operations/duplicate-level.d.ts.map +1 -1
  127. package/dist/agent-operations/duplicate-level.js +2 -1
  128. package/dist/agent-operations/find-by-type.d.ts +14 -7
  129. package/dist/agent-operations/find-by-type.d.ts.map +1 -1
  130. package/dist/agent-operations/find-by-type.js +266 -43
  131. package/dist/agent-operations/furnish-room.d.ts +22 -1
  132. package/dist/agent-operations/furnish-room.d.ts.map +1 -1
  133. package/dist/agent-operations/furnish-room.js +66 -19
  134. package/dist/agent-operations/furniture-kind.d.ts +22 -0
  135. package/dist/agent-operations/furniture-kind.d.ts.map +1 -0
  136. package/dist/agent-operations/furniture-kind.js +69 -0
  137. package/dist/agent-operations/get-node.d.ts +5 -2
  138. package/dist/agent-operations/get-node.d.ts.map +1 -1
  139. package/dist/agent-operations/get-node.js +82 -10
  140. package/dist/agent-operations/hosted-services.d.ts +2 -1
  141. package/dist/agent-operations/hosted-services.d.ts.map +1 -1
  142. package/dist/agent-operations/index.d.ts +281 -69
  143. package/dist/agent-operations/index.d.ts.map +1 -1
  144. package/dist/agent-operations/index.js +66 -5
  145. package/dist/agent-operations/item-space.d.ts +22 -0
  146. package/dist/agent-operations/item-space.d.ts.map +1 -0
  147. package/dist/agent-operations/item-space.js +69 -0
  148. package/dist/agent-operations/layout-clearance.d.ts +52 -3
  149. package/dist/agent-operations/layout-clearance.d.ts.map +1 -1
  150. package/dist/agent-operations/layout-clearance.js +340 -30
  151. package/dist/agent-operations/level-height-fill.d.ts +12 -0
  152. package/dist/agent-operations/level-height-fill.d.ts.map +1 -0
  153. package/dist/agent-operations/level-height-fill.js +59 -0
  154. package/dist/agent-operations/level-reads.d.ts +5 -1
  155. package/dist/agent-operations/level-reads.d.ts.map +1 -1
  156. package/dist/agent-operations/level-reads.js +10 -3
  157. package/dist/agent-operations/list-levels.d.ts.map +1 -1
  158. package/dist/agent-operations/list-levels.js +23 -0
  159. package/dist/agent-operations/material-preset.d.ts.map +1 -1
  160. package/dist/agent-operations/material-preset.js +3 -9
  161. package/dist/agent-operations/material-refs.d.ts +7 -1
  162. package/dist/agent-operations/material-refs.d.ts.map +1 -1
  163. package/dist/agent-operations/material-refs.js +10 -5
  164. package/dist/agent-operations/merge-windows.d.ts +6 -0
  165. package/dist/agent-operations/merge-windows.d.ts.map +1 -0
  166. package/dist/agent-operations/merge-windows.js +27 -0
  167. package/dist/agent-operations/move-roofs.d.ts +9 -0
  168. package/dist/agent-operations/move-roofs.d.ts.map +1 -0
  169. package/dist/agent-operations/move-roofs.js +29 -0
  170. package/dist/agent-operations/paint.d.ts +2 -1
  171. package/dist/agent-operations/paint.d.ts.map +1 -1
  172. package/dist/agent-operations/paint.js +163 -53
  173. package/dist/agent-operations/photo-elevation.d.ts +155 -0
  174. package/dist/agent-operations/photo-elevation.d.ts.map +1 -0
  175. package/dist/agent-operations/photo-elevation.js +761 -0
  176. package/dist/agent-operations/place-in-room.d.ts +29 -0
  177. package/dist/agent-operations/place-in-room.d.ts.map +1 -0
  178. package/dist/agent-operations/place-in-room.js +403 -0
  179. package/dist/agent-operations/place-items.d.ts.map +1 -1
  180. package/dist/agent-operations/place-items.js +15 -2
  181. package/dist/agent-operations/plan-geometry.d.ts.map +1 -1
  182. package/dist/agent-operations/plan-geometry.js +3 -0
  183. package/dist/agent-operations/point-context.d.ts +139 -0
  184. package/dist/agent-operations/point-context.d.ts.map +1 -0
  185. package/dist/agent-operations/point-context.js +1 -0
  186. package/dist/agent-operations/project-files.d.ts +9 -0
  187. package/dist/agent-operations/project-files.d.ts.map +1 -0
  188. package/dist/agent-operations/project-files.js +25 -0
  189. package/dist/agent-operations/record-made.d.ts +18 -0
  190. package/dist/agent-operations/record-made.d.ts.map +1 -0
  191. package/dist/agent-operations/record-made.js +28 -0
  192. package/dist/agent-operations/roof-footprint.d.ts +24 -0
  193. package/dist/agent-operations/roof-footprint.d.ts.map +1 -0
  194. package/dist/agent-operations/roof-footprint.js +242 -0
  195. package/dist/agent-operations/roof-writes.d.ts +20 -0
  196. package/dist/agent-operations/roof-writes.d.ts.map +1 -0
  197. package/dist/agent-operations/roof-writes.js +165 -0
  198. package/dist/agent-operations/room-findings.d.ts +54 -0
  199. package/dist/agent-operations/room-findings.d.ts.map +1 -0
  200. package/dist/agent-operations/room-findings.js +143 -0
  201. package/dist/agent-operations/room-floor-script.d.ts +23 -0
  202. package/dist/agent-operations/room-floor-script.d.ts.map +1 -0
  203. package/dist/agent-operations/room-floor-script.js +54 -0
  204. package/dist/agent-operations/room-structure.d.ts +2 -2
  205. package/dist/agent-operations/room-structure.d.ts.map +1 -1
  206. package/dist/agent-operations/scene-checkpoint.d.ts +94 -0
  207. package/dist/agent-operations/scene-checkpoint.d.ts.map +1 -0
  208. package/dist/agent-operations/scene-checkpoint.js +176 -0
  209. package/dist/agent-operations/scene-queries.d.ts +3750 -3319
  210. package/dist/agent-operations/scene-queries.d.ts.map +1 -1
  211. package/dist/agent-operations/scene-queries.js +13 -23
  212. package/dist/agent-operations/scene-review.d.ts +52 -0
  213. package/dist/agent-operations/scene-review.d.ts.map +1 -0
  214. package/dist/agent-operations/scene-review.js +106 -0
  215. package/dist/agent-operations/scene-view.d.ts +82 -15
  216. package/dist/agent-operations/scene-view.d.ts.map +1 -1
  217. package/dist/agent-operations/scene-view.js +408 -51
  218. package/dist/agent-operations/search-assets.d.ts +2 -2
  219. package/dist/agent-operations/search-assets.d.ts.map +1 -1
  220. package/dist/agent-operations/search-assets.js +4 -3
  221. package/dist/agent-operations/search-materials.d.ts +9 -3
  222. package/dist/agent-operations/search-materials.d.ts.map +1 -1
  223. package/dist/agent-operations/search-materials.js +83 -29
  224. package/dist/agent-operations/set-checkpoint.d.ts +9 -0
  225. package/dist/agent-operations/set-checkpoint.d.ts.map +1 -0
  226. package/dist/agent-operations/set-checkpoint.js +31 -0
  227. package/dist/agent-operations/set-ground-level.d.ts +12 -0
  228. package/dist/agent-operations/set-ground-level.d.ts.map +1 -0
  229. package/dist/agent-operations/set-ground-level.js +61 -0
  230. package/dist/agent-operations/site.d.ts +21 -0
  231. package/dist/agent-operations/site.d.ts.map +1 -0
  232. package/dist/agent-operations/site.js +123 -0
  233. package/dist/agent-operations/types.d.ts +66 -7
  234. package/dist/agent-operations/types.d.ts.map +1 -1
  235. package/dist/agent-operations/verify-scene.d.ts +39 -5
  236. package/dist/agent-operations/verify-scene.d.ts.map +1 -1
  237. package/dist/agent-operations/verify-scene.js +223 -44
  238. package/dist/agent-operations/wall-face-script.d.ts +28 -0
  239. package/dist/agent-operations/wall-face-script.d.ts.map +1 -0
  240. package/dist/agent-operations/wall-face-script.js +62 -0
  241. package/dist/agent-operations/wall-object-observations.d.ts +41 -0
  242. package/dist/agent-operations/wall-object-observations.d.ts.map +1 -0
  243. package/dist/agent-operations/wall-object-observations.js +249 -0
  244. package/dist/agent-operations/wall-opening.d.ts +23 -23
  245. package/dist/agent-operations/wall-opening.d.ts.map +1 -1
  246. package/dist/agent-operations/wall-skirting.d.ts +24 -0
  247. package/dist/agent-operations/wall-skirting.d.ts.map +1 -0
  248. package/dist/agent-operations/wall-skirting.js +85 -0
  249. package/dist/agent-tools/add-object.d.ts +11 -7
  250. package/dist/agent-tools/add-object.d.ts.map +1 -1
  251. package/dist/agent-tools/add-object.js +17 -11
  252. package/dist/agent-tools/assets.d.ts +8 -0
  253. package/dist/agent-tools/assets.d.ts.map +1 -1
  254. package/dist/agent-tools/assets.js +13 -1
  255. package/dist/agent-tools/author-scene.d.ts +651 -0
  256. package/dist/agent-tools/author-scene.d.ts.map +1 -0
  257. package/dist/agent-tools/author-scene.js +252 -0
  258. package/dist/agent-tools/batch.d.ts +25 -0
  259. package/dist/agent-tools/batch.d.ts.map +1 -0
  260. package/dist/agent-tools/batch.js +61 -0
  261. package/dist/agent-tools/checkpoints.d.ts +13 -0
  262. package/dist/agent-tools/checkpoints.d.ts.map +1 -0
  263. package/dist/agent-tools/checkpoints.js +16 -0
  264. package/dist/agent-tools/clear-scene.d.ts.map +1 -1
  265. package/dist/agent-tools/collections.d.ts +6 -6
  266. package/dist/agent-tools/collections.d.ts.map +1 -1
  267. package/dist/agent-tools/columns.d.ts +18 -18
  268. package/dist/agent-tools/columns.js +2 -2
  269. package/dist/agent-tools/corner-window.d.ts +46 -0
  270. package/dist/agent-tools/corner-window.d.ts.map +1 -0
  271. package/dist/agent-tools/corner-window.js +47 -0
  272. package/dist/agent-tools/create-room.d.ts +26 -25
  273. package/dist/agent-tools/create-room.d.ts.map +1 -1
  274. package/dist/agent-tools/create-room.js +11 -4
  275. package/dist/agent-tools/design-brief.d.ts +408 -0
  276. package/dist/agent-tools/design-brief.d.ts.map +1 -0
  277. package/dist/agent-tools/design-brief.js +149 -0
  278. package/dist/agent-tools/designs.d.ts +34 -0
  279. package/dist/agent-tools/designs.d.ts.map +1 -0
  280. package/dist/agent-tools/designs.js +50 -0
  281. package/dist/agent-tools/fences.d.ts +28 -0
  282. package/dist/agent-tools/fences.d.ts.map +1 -0
  283. package/dist/agent-tools/fences.js +31 -0
  284. package/dist/agent-tools/find-by-type.d.ts +8 -1
  285. package/dist/agent-tools/find-by-type.d.ts.map +1 -1
  286. package/dist/agent-tools/find-by-type.js +23 -2
  287. package/dist/agent-tools/furnish-room.d.ts +10 -8
  288. package/dist/agent-tools/furnish-room.d.ts.map +1 -1
  289. package/dist/agent-tools/furnish-room.js +3 -1
  290. package/dist/agent-tools/hosted-services.d.ts +177 -141
  291. package/dist/agent-tools/hosted-services.d.ts.map +1 -1
  292. package/dist/agent-tools/hosted-services.js +47 -14
  293. package/dist/agent-tools/index.d.ts +894 -215
  294. package/dist/agent-tools/index.d.ts.map +1 -1
  295. package/dist/agent-tools/index.js +47 -3
  296. package/dist/agent-tools/levels.d.ts +11 -3
  297. package/dist/agent-tools/levels.d.ts.map +1 -1
  298. package/dist/agent-tools/levels.js +16 -5
  299. package/dist/agent-tools/measurement.d.ts +38 -20
  300. package/dist/agent-tools/measurement.d.ts.map +1 -1
  301. package/dist/agent-tools/measurement.js +117 -67
  302. package/dist/agent-tools/merge-windows.d.ts +10 -0
  303. package/dist/agent-tools/merge-windows.d.ts.map +1 -0
  304. package/dist/agent-tools/merge-windows.js +12 -0
  305. package/dist/agent-tools/nodes.d.ts.map +1 -1
  306. package/dist/agent-tools/nodes.js +1 -1
  307. package/dist/agent-tools/notation-inventory.d.ts +16 -0
  308. package/dist/agent-tools/notation-inventory.d.ts.map +1 -0
  309. package/dist/agent-tools/notation-inventory.js +105 -0
  310. package/dist/agent-tools/paint.d.ts +5 -5
  311. package/dist/agent-tools/paint.d.ts.map +1 -1
  312. package/dist/agent-tools/paint.js +1 -1
  313. package/dist/agent-tools/photo-elevation.d.ts +32 -0
  314. package/dist/agent-tools/photo-elevation.d.ts.map +1 -0
  315. package/dist/agent-tools/photo-elevation.js +73 -0
  316. package/dist/agent-tools/place-in-room.d.ts +35 -0
  317. package/dist/agent-tools/place-in-room.d.ts.map +1 -0
  318. package/dist/agent-tools/place-in-room.js +61 -0
  319. package/dist/agent-tools/place-items.d.ts +1 -1
  320. package/dist/agent-tools/place-items.js +2 -2
  321. package/dist/agent-tools/project-files.d.ts +189 -0
  322. package/dist/agent-tools/project-files.d.ts.map +1 -0
  323. package/dist/agent-tools/project-files.js +99 -0
  324. package/dist/agent-tools/refusal.d.ts.map +1 -1
  325. package/dist/agent-tools/retired.d.ts +21 -0
  326. package/dist/agent-tools/retired.d.ts.map +1 -0
  327. package/dist/agent-tools/retired.js +29 -0
  328. package/dist/agent-tools/roofs.d.ts +100 -0
  329. package/dist/agent-tools/roofs.d.ts.map +1 -0
  330. package/dist/agent-tools/roofs.js +96 -0
  331. package/dist/agent-tools/room-structure.d.ts +46 -38
  332. package/dist/agent-tools/room-structure.d.ts.map +1 -1
  333. package/dist/agent-tools/room-structure.js +30 -27
  334. package/dist/agent-tools/search-materials.d.ts +22 -3
  335. package/dist/agent-tools/search-materials.d.ts.map +1 -1
  336. package/dist/agent-tools/search-materials.js +13 -14
  337. package/dist/agent-tools/site.d.ts +27 -0
  338. package/dist/agent-tools/site.d.ts.map +1 -0
  339. package/dist/agent-tools/site.js +40 -0
  340. package/dist/agent-tools/sources.d.ts +12 -0
  341. package/dist/agent-tools/sources.d.ts.map +1 -0
  342. package/dist/agent-tools/sources.js +11 -0
  343. package/dist/agent-tools/stairs.d.ts +48 -28
  344. package/dist/agent-tools/stairs.d.ts.map +1 -1
  345. package/dist/agent-tools/stairs.js +65 -22
  346. package/dist/agent-tools/verify-scene.d.ts.map +1 -1
  347. package/dist/agent-tools/verify-scene.js +1 -1
  348. package/dist/agent-tools/view-scene.d.ts +50 -12
  349. package/dist/agent-tools/view-scene.d.ts.map +1 -1
  350. package/dist/agent-tools/view-scene.js +74 -31
  351. package/dist/agent-tools/wall-openings.d.ts +77 -73
  352. package/dist/agent-tools/wall-openings.d.ts.map +1 -1
  353. package/dist/agent-tools/wall-openings.js +9 -5
  354. package/dist/agent-tools/walls.d.ts +4 -4
  355. package/dist/agent-tools/walls.d.ts.map +1 -1
  356. package/dist/agent-tools/walls.js +7 -2
  357. package/dist/building/__fixtures__/wall-opening-cases.d.ts +454 -250
  358. package/dist/building/__fixtures__/wall-opening-cases.d.ts.map +1 -1
  359. package/dist/building/__fixtures__/wall-opening-cases.js +62 -2
  360. package/dist/building/corner-window.d.ts +56 -0
  361. package/dist/building/corner-window.d.ts.map +1 -0
  362. package/dist/building/corner-window.js +179 -0
  363. package/dist/building/ground-level.d.ts +26 -0
  364. package/dist/building/ground-level.d.ts.map +1 -0
  365. package/dist/building/ground-level.js +58 -0
  366. package/dist/building/index.d.ts +5 -0
  367. package/dist/building/index.d.ts.map +1 -1
  368. package/dist/building/index.js +5 -0
  369. package/dist/building/level-duplication.d.ts +7472 -6613
  370. package/dist/building/level-duplication.d.ts.map +1 -1
  371. package/dist/building/level-duplication.js +18 -4
  372. package/dist/building/level-insertion.d.ts +55 -0
  373. package/dist/building/level-insertion.d.ts.map +1 -0
  374. package/dist/building/level-insertion.js +35 -0
  375. package/dist/building/merge-windows.d.ts +58 -0
  376. package/dist/building/merge-windows.d.ts.map +1 -0
  377. package/dist/building/merge-windows.js +189 -0
  378. package/dist/building/opening-style-presets.d.ts +2 -2
  379. package/dist/building/opening-style-presets.d.ts.map +1 -1
  380. package/dist/building/photo-elevation.d.ts +125 -0
  381. package/dist/building/photo-elevation.d.ts.map +1 -0
  382. package/dist/building/photo-elevation.js +404 -0
  383. package/dist/building/wall-gaps.d.ts +13 -0
  384. package/dist/building/wall-gaps.d.ts.map +1 -0
  385. package/dist/building/wall-gaps.js +158 -0
  386. package/dist/building/wall-openings.d.ts +154 -119
  387. package/dist/building/wall-openings.d.ts.map +1 -1
  388. package/dist/building/wall-openings.js +37 -9
  389. package/dist/capture/schema.d.ts +22 -22
  390. package/dist/capture/source.d.ts.map +1 -1
  391. package/dist/capture/source.js +1 -1
  392. package/dist/commands/structure/create-zone.d.ts +12 -1
  393. package/dist/commands/structure/create-zone.d.ts.map +1 -1
  394. package/dist/commands/structure/create-zone.js +49 -0
  395. package/dist/commands/structure/divide-zone.d.ts +3 -3
  396. package/dist/commands/structure/index.d.ts +1 -1
  397. package/dist/commands/structure/index.d.ts.map +1 -1
  398. package/dist/commands/structure/index.js +1 -1
  399. package/dist/commands/structure/set-floor-foundation.d.ts +6 -6
  400. package/dist/commands/structure/set-zone-intent.d.ts +4 -0
  401. package/dist/commands/structure/set-zone-intent.d.ts.map +1 -1
  402. package/dist/commands/structure/set-zone-intent.js +19 -0
  403. package/dist/commands/structure/shared.d.ts +3642 -3213
  404. package/dist/commands/structure/shared.d.ts.map +1 -1
  405. package/dist/commands/structure/zone-wall-merge.d.ts +4149 -3334
  406. package/dist/commands/structure/zone-wall-merge.d.ts.map +1 -1
  407. package/dist/contracts/reference-inventory.d.ts.map +1 -1
  408. package/dist/contracts/reference-inventory.js +106 -26
  409. package/dist/events/bus.d.ts +22 -3
  410. package/dist/events/bus.d.ts.map +1 -1
  411. package/dist/events/capture-sessions.d.ts +5 -0
  412. package/dist/events/capture-sessions.d.ts.map +1 -0
  413. package/dist/events/capture-sessions.js +31 -0
  414. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  415. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +1 -2
  416. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  417. package/dist/hooks/spatial-grid/spatial-grid-manager.js +4 -6
  418. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +3608 -3179
  419. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  420. package/dist/hooks/spatial-grid/spatial-grid.d.ts.map +1 -1
  421. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -1
  422. package/dist/hooks/spatial-grid/support-host-patch.js +11 -2
  423. package/dist/hooks/spatial-grid/use-spatial-query.d.ts +3 -3
  424. package/dist/hooks/spatial-grid/wall-spatial-grid.d.ts.map +1 -1
  425. package/dist/index.d.ts +37 -9
  426. package/dist/index.d.ts.map +1 -1
  427. package/dist/index.js +36 -9
  428. package/dist/lib/__fixtures__/mezzanine.d.ts +11800 -10132
  429. package/dist/lib/__fixtures__/mezzanine.d.ts.map +1 -1
  430. package/dist/lib/absorb-wall-separators.d.ts +3642 -3213
  431. package/dist/lib/absorb-wall-separators.d.ts.map +1 -1
  432. package/dist/lib/angle-accumulator.d.ts.map +1 -1
  433. package/dist/lib/artifact-store.d.ts.map +1 -1
  434. package/dist/lib/below-grade-footprints.d.ts +65 -0
  435. package/dist/lib/below-grade-footprints.d.ts.map +1 -0
  436. package/dist/lib/below-grade-footprints.js +181 -0
  437. package/dist/lib/building-footprint.d.ts +33 -0
  438. package/dist/lib/building-footprint.d.ts.map +1 -0
  439. package/dist/lib/building-footprint.js +89 -0
  440. package/dist/lib/corner-pair.d.ts +1129 -0
  441. package/dist/lib/corner-pair.d.ts.map +1 -0
  442. package/dist/lib/corner-pair.js +130 -0
  443. package/dist/lib/corner-snap.d.ts +54 -0
  444. package/dist/lib/corner-snap.d.ts.map +1 -0
  445. package/dist/lib/corner-snap.js +125 -0
  446. package/dist/lib/critically-damped.d.ts +11 -0
  447. package/dist/lib/critically-damped.d.ts.map +1 -0
  448. package/dist/lib/critically-damped.js +14 -0
  449. package/dist/lib/deepest-drawn.d.ts +18 -0
  450. package/dist/lib/deepest-drawn.d.ts.map +1 -0
  451. package/dist/lib/deepest-drawn.js +65 -0
  452. package/dist/lib/door-operation.d.ts +1 -1
  453. package/dist/lib/exterior-wall-loops.d.ts +17 -0
  454. package/dist/lib/exterior-wall-loops.d.ts.map +1 -0
  455. package/dist/lib/exterior-wall-loops.js +334 -0
  456. package/dist/lib/finish-script.d.ts +61 -0
  457. package/dist/lib/finish-script.d.ts.map +1 -0
  458. package/dist/lib/finish-script.js +86 -0
  459. package/dist/lib/floor-intent-changes.d.ts.map +1 -1
  460. package/dist/lib/floor-intent-changes.js +4 -4
  461. package/dist/lib/floor-plate-paint.d.ts +3 -1
  462. package/dist/lib/floor-plate-paint.d.ts.map +1 -1
  463. package/dist/lib/floor-plate-paint.js +24 -4
  464. package/dist/lib/floor-plates.d.ts +50 -50
  465. package/dist/lib/floor-script.d.ts +24 -0
  466. package/dist/lib/floor-script.d.ts.map +1 -0
  467. package/dist/lib/floor-script.js +51 -0
  468. package/dist/lib/foundation-construction.d.ts +73 -0
  469. package/dist/lib/foundation-construction.d.ts.map +1 -0
  470. package/dist/lib/foundation-construction.js +242 -0
  471. package/dist/lib/foundation-standard.d.ts +30 -0
  472. package/dist/lib/foundation-standard.d.ts.map +1 -0
  473. package/dist/lib/foundation-standard.js +30 -0
  474. package/dist/lib/foundation-wall.d.ts +36 -0
  475. package/dist/lib/foundation-wall.d.ts.map +1 -0
  476. package/dist/lib/foundation-wall.js +66 -0
  477. package/dist/lib/generic-foundation.d.ts +40 -0
  478. package/dist/lib/generic-foundation.d.ts.map +1 -0
  479. package/dist/lib/generic-foundation.js +200 -0
  480. package/dist/lib/geometry-script-node.d.ts +32 -3
  481. package/dist/lib/geometry-script-node.d.ts.map +1 -1
  482. package/dist/lib/geometry-script-node.js +26 -0
  483. package/dist/lib/grade-standing.d.ts +38 -0
  484. package/dist/lib/grade-standing.d.ts.map +1 -0
  485. package/dist/lib/grade-standing.js +137 -0
  486. package/dist/lib/ground-level.d.ts +20 -0
  487. package/dist/lib/ground-level.d.ts.map +1 -0
  488. package/dist/lib/ground-level.js +49 -0
  489. package/dist/lib/ground-over-part.d.ts +13 -0
  490. package/dist/lib/ground-over-part.d.ts.map +1 -0
  491. package/dist/lib/ground-over-part.js +94 -0
  492. package/dist/lib/ground-seat.d.ts +47 -0
  493. package/dist/lib/ground-seat.d.ts.map +1 -0
  494. package/dist/lib/ground-seat.js +61 -0
  495. package/dist/lib/ground-window.d.ts +39 -0
  496. package/dist/lib/ground-window.d.ts.map +1 -0
  497. package/dist/lib/ground-window.js +147 -0
  498. package/dist/lib/opening-floor-datum.d.ts.map +1 -1
  499. package/dist/lib/opening-floor-datum.js +2 -3
  500. package/dist/lib/own-floor-intent.d.ts.map +1 -1
  501. package/dist/lib/own-floor-intent.js +4 -4
  502. package/dist/lib/plate-surface.d.ts.map +1 -1
  503. package/dist/lib/plate-surface.js +3 -1
  504. package/dist/lib/point-ask.d.ts +9 -0
  505. package/dist/lib/point-ask.d.ts.map +1 -0
  506. package/dist/lib/point-ask.js +36 -0
  507. package/dist/lib/room-drawn-floor.d.ts +1 -1
  508. package/dist/lib/room-drawn-floor.d.ts.map +1 -1
  509. package/dist/lib/room-floor-feasibility.d.ts.map +1 -1
  510. package/dist/lib/room-floor-feasibility.js +3 -3
  511. package/dist/lib/room-graph.d.ts.map +1 -1
  512. package/dist/lib/room-graph.js +2 -0
  513. package/dist/lib/room-name.d.ts +2 -0
  514. package/dist/lib/room-name.d.ts.map +1 -1
  515. package/dist/lib/room-name.js +2 -0
  516. package/dist/lib/room-topology-index.d.ts.map +1 -1
  517. package/dist/lib/room-topology-index.js +1 -1
  518. package/dist/lib/room-zone-adoption.d.ts.map +1 -1
  519. package/dist/lib/script-inputs-key.d.ts +3 -0
  520. package/dist/lib/script-inputs-key.d.ts.map +1 -0
  521. package/dist/lib/script-inputs-key.js +13 -0
  522. package/dist/lib/setback-envelope.d.ts +95 -5
  523. package/dist/lib/setback-envelope.d.ts.map +1 -1
  524. package/dist/lib/setback-envelope.js +351 -35
  525. package/dist/lib/site-flatwork.d.ts +11 -0
  526. package/dist/lib/site-flatwork.d.ts.map +1 -0
  527. package/dist/lib/site-flatwork.js +11 -0
  528. package/dist/lib/site-ground-height.d.ts +13 -0
  529. package/dist/lib/site-ground-height.d.ts.map +1 -0
  530. package/dist/lib/site-ground-height.js +16 -0
  531. package/dist/lib/site-placement.d.ts +362 -0
  532. package/dist/lib/site-placement.d.ts.map +1 -0
  533. package/dist/lib/site-placement.js +942 -0
  534. package/dist/lib/snap-ease.d.ts +20 -0
  535. package/dist/lib/snap-ease.d.ts.map +1 -0
  536. package/dist/lib/snap-ease.js +50 -0
  537. package/dist/lib/structure-kernel.d.ts +1 -1
  538. package/dist/lib/structure-kernel.d.ts.map +1 -1
  539. package/dist/lib/structure-kernel.js +2 -0
  540. package/dist/lib/surface-support-references.d.ts +4 -0
  541. package/dist/lib/surface-support-references.d.ts.map +1 -0
  542. package/dist/lib/surface-support-references.js +19 -0
  543. package/dist/lib/terrain-support-query.d.ts +10 -0
  544. package/dist/lib/terrain-support-query.d.ts.map +1 -1
  545. package/dist/lib/terrain-support-query.js +1 -1
  546. package/dist/lib/wall-face-script.d.ts +66 -0
  547. package/dist/lib/wall-face-script.d.ts.map +1 -0
  548. package/dist/lib/wall-face-script.js +235 -0
  549. package/dist/lib/zone-colors.d.ts +1 -1
  550. package/dist/lib/zone-colors.d.ts.map +1 -1
  551. package/dist/lib/zone-quantities.d.ts.map +1 -1
  552. package/dist/lib/zone-quantities.js +4 -5
  553. package/dist/material-kinds.d.ts +9 -0
  554. package/dist/material-kinds.d.ts.map +1 -0
  555. package/dist/material-kinds.js +30 -0
  556. package/dist/material-library.d.ts +4 -4
  557. package/dist/material-library.d.ts.map +1 -1
  558. package/dist/material-library.js +72 -26
  559. package/dist/node-slots/index.d.ts +1 -0
  560. package/dist/node-slots/index.d.ts.map +1 -1
  561. package/dist/node-slots/index.js +7 -1
  562. package/dist/node-slots/roof.d.ts +5 -0
  563. package/dist/node-slots/roof.d.ts.map +1 -0
  564. package/dist/node-slots/roof.js +12 -0
  565. package/dist/node-slots/stair.d.ts +2 -0
  566. package/dist/node-slots/stair.d.ts.map +1 -1
  567. package/dist/node-slots/stair.js +6 -2
  568. package/dist/procedural-items/design-placement.d.ts.map +1 -1
  569. package/dist/procedural-items/design.d.ts +19 -19
  570. package/dist/procedural-items/fixtures.d.ts +297 -297
  571. package/dist/procedural-items/fixtures.d.ts.map +1 -1
  572. package/dist/procedural-items/integration.d.ts +106 -106
  573. package/dist/procedural-items/joints.d.ts +4 -4
  574. package/dist/procedural-items/library-colors.d.ts +22 -22
  575. package/dist/procedural-items/library-colors.d.ts.map +1 -1
  576. package/dist/procedural-items/motion-controller.d.ts.map +1 -1
  577. package/dist/procedural-items/node.d.ts +291 -291
  578. package/dist/procedural-items/query.d.ts +1 -1
  579. package/dist/procedural-items/query.d.ts.map +1 -1
  580. package/dist/procedural-items/recipe.d.ts +11 -11
  581. package/dist/procedural-items/recipe.d.ts.map +1 -1
  582. package/dist/procedural-items/section.d.ts.map +1 -1
  583. package/dist/registry/index.d.ts +1 -1
  584. package/dist/registry/index.d.ts.map +1 -1
  585. package/dist/registry/scene-api.d.ts +1 -0
  586. package/dist/registry/scene-api.d.ts.map +1 -1
  587. package/dist/registry/scene-api.js +3 -0
  588. package/dist/registry/subtree.d.ts.map +1 -1
  589. package/dist/registry/subtree.js +2 -0
  590. package/dist/registry/types.d.ts +120 -1
  591. package/dist/registry/types.d.ts.map +1 -1
  592. package/dist/schema/assembly.d.ts +41 -41
  593. package/dist/schema/asset-url.d.ts +1 -1
  594. package/dist/schema/asset-url.d.ts.map +1 -1
  595. package/dist/schema/base.d.ts +9 -9
  596. package/dist/schema/base.d.ts.map +1 -1
  597. package/dist/schema/camera.d.ts +1 -1
  598. package/dist/schema/collection-templates.d.ts +20 -20
  599. package/dist/schema/collection-templates.d.ts.map +1 -1
  600. package/dist/schema/geometry-metadata.d.ts +7 -7
  601. package/dist/schema/geometry-metadata.d.ts.map +1 -1
  602. package/dist/schema/geometry-source.d.ts +26 -16
  603. package/dist/schema/geometry-source.d.ts.map +1 -1
  604. package/dist/schema/geometry-source.js +14 -0
  605. package/dist/schema/index.d.ts +10 -7
  606. package/dist/schema/index.d.ts.map +1 -1
  607. package/dist/schema/index.js +10 -7
  608. package/dist/schema/material.d.ts +33 -33
  609. package/dist/schema/nodes/barrel-roof.d.ts +3 -0
  610. package/dist/schema/nodes/barrel-roof.d.ts.map +1 -0
  611. package/dist/schema/nodes/barrel-roof.js +11 -0
  612. package/dist/schema/nodes/block.d.ts +8 -8
  613. package/dist/schema/nodes/box-vent.d.ts +13 -13
  614. package/dist/schema/nodes/building.d.ts +9 -8
  615. package/dist/schema/nodes/building.d.ts.map +1 -1
  616. package/dist/schema/nodes/building.js +2 -0
  617. package/dist/schema/nodes/cabinet.d.ts +130 -129
  618. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  619. package/dist/schema/nodes/cabinet.js +1 -1
  620. package/dist/schema/nodes/ceiling.d.ts +15 -15
  621. package/dist/schema/nodes/chimney.d.ts +23 -23
  622. package/dist/schema/nodes/column.d.ts +207 -199
  623. package/dist/schema/nodes/column.d.ts.map +1 -1
  624. package/dist/schema/nodes/column.js +2 -0
  625. package/dist/schema/nodes/construction-dimension.d.ts +34 -34
  626. package/dist/schema/nodes/cupola.d.ts +15 -15
  627. package/dist/schema/nodes/curtain-wall.d.ts +21 -20
  628. package/dist/schema/nodes/curtain-wall.d.ts.map +1 -1
  629. package/dist/schema/nodes/curtain-wall.js +23 -0
  630. package/dist/schema/nodes/door.d.ts +50 -43
  631. package/dist/schema/nodes/door.d.ts.map +1 -1
  632. package/dist/schema/nodes/door.js +19 -0
  633. package/dist/schema/nodes/dormer.d.ts +37 -36
  634. package/dist/schema/nodes/dormer.d.ts.map +1 -1
  635. package/dist/schema/nodes/downspout.d.ts +17 -17
  636. package/dist/schema/nodes/duct-fitting.d.ts +24 -24
  637. package/dist/schema/nodes/duct-segment.d.ts +14 -14
  638. package/dist/schema/nodes/duct-terminal.d.ts +12 -12
  639. package/dist/schema/nodes/elevator.d.ts +15 -15
  640. package/dist/schema/nodes/eyebrow-vent.d.ts +13 -13
  641. package/dist/schema/nodes/fence-feature.d.ts +37 -37
  642. package/dist/schema/nodes/fence-types.d.ts +32 -0
  643. package/dist/schema/nodes/fence-types.d.ts.map +1 -0
  644. package/dist/schema/nodes/fence-types.js +22 -0
  645. package/dist/schema/nodes/fence.d.ts +43 -72
  646. package/dist/schema/nodes/fence.d.ts.map +1 -1
  647. package/dist/schema/nodes/fence.js +4 -20
  648. package/dist/schema/nodes/floor-opening.d.ts +8 -8
  649. package/dist/schema/nodes/guide.d.ts +8 -8
  650. package/dist/schema/nodes/gutter.d.ts +14 -14
  651. package/dist/schema/nodes/gutter.d.ts.map +1 -1
  652. package/dist/schema/nodes/gutter.js +6 -5
  653. package/dist/schema/nodes/hvac-equipment.d.ts +13 -13
  654. package/dist/schema/nodes/imported-mesh.d.ts +8 -8
  655. package/dist/schema/nodes/item.d.ts +30 -25
  656. package/dist/schema/nodes/item.d.ts.map +1 -1
  657. package/dist/schema/nodes/lean-to-extension.d.ts +36 -36
  658. package/dist/schema/nodes/level.d.ts +9 -9
  659. package/dist/schema/nodes/lineset.d.ts +8 -8
  660. package/dist/schema/nodes/liquid-line.d.ts +8 -8
  661. package/dist/schema/nodes/measurement.d.ts +8 -8
  662. package/dist/schema/nodes/opening-types.d.ts +13 -13
  663. package/dist/schema/nodes/opening-types.d.ts.map +1 -1
  664. package/dist/schema/nodes/pipe-fitting.d.ts +15 -15
  665. package/dist/schema/nodes/pipe-segment.d.ts +11 -11
  666. package/dist/schema/nodes/pipe-trap.d.ts +9 -9
  667. package/dist/schema/nodes/ridge-vent.d.ts +14 -14
  668. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  669. package/dist/schema/nodes/ridge-vent.js +3 -1
  670. package/dist/schema/nodes/roof-glazing-config.d.ts +90 -0
  671. package/dist/schema/nodes/roof-glazing-config.d.ts.map +1 -0
  672. package/dist/schema/nodes/roof-glazing-config.js +34 -0
  673. package/dist/schema/nodes/roof-glazing.d.ts +57 -0
  674. package/dist/schema/nodes/roof-glazing.d.ts.map +1 -0
  675. package/dist/schema/nodes/roof-glazing.js +514 -0
  676. package/dist/schema/nodes/roof-segment-resize.d.ts +4 -0
  677. package/dist/schema/nodes/roof-segment-resize.d.ts.map +1 -0
  678. package/dist/schema/nodes/roof-segment-resize.js +21 -0
  679. package/dist/schema/nodes/roof-segment-shape.d.ts +5 -0
  680. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -1
  681. package/dist/schema/nodes/roof-segment-shape.js +44 -0
  682. package/dist/schema/nodes/roof-segment-walls.d.ts +1 -1
  683. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -1
  684. package/dist/schema/nodes/roof-segment-walls.js +24 -0
  685. package/dist/schema/nodes/roof-segment.d.ts +153 -46
  686. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  687. package/dist/schema/nodes/roof-segment.js +91 -20
  688. package/dist/schema/nodes/roof-types.d.ts +14 -0
  689. package/dist/schema/nodes/roof-types.d.ts.map +1 -0
  690. package/dist/schema/nodes/roof-types.js +14 -0
  691. package/dist/schema/nodes/roof.d.ts +49 -49
  692. package/dist/schema/nodes/scan.d.ts +8 -8
  693. package/dist/schema/nodes/separator.d.ts +8 -8
  694. package/dist/schema/nodes/shelf.d.ts +16 -16
  695. package/dist/schema/nodes/site-facts.d.ts +64 -0
  696. package/dist/schema/nodes/site-facts.d.ts.map +1 -0
  697. package/dist/schema/nodes/site-facts.js +73 -0
  698. package/dist/schema/nodes/site.d.ts +105 -63
  699. package/dist/schema/nodes/site.d.ts.map +1 -1
  700. package/dist/schema/nodes/site.js +7 -70
  701. package/dist/schema/nodes/skylight.d.ts +41 -41
  702. package/dist/schema/nodes/skylight.d.ts.map +1 -1
  703. package/dist/schema/nodes/slab.d.ts +21 -21
  704. package/dist/schema/nodes/solar-panel.d.ts +21 -21
  705. package/dist/schema/nodes/spawn.d.ts +8 -8
  706. package/dist/schema/nodes/stair-construction.d.ts +3 -3
  707. package/dist/schema/nodes/stair-defaults.d.ts +16 -0
  708. package/dist/schema/nodes/stair-defaults.d.ts.map +1 -0
  709. package/dist/schema/nodes/stair-defaults.js +15 -0
  710. package/dist/schema/nodes/stair-segment.d.ts +22 -22
  711. package/dist/schema/nodes/stair-types.d.ts +29 -0
  712. package/dist/schema/nodes/stair-types.d.ts.map +1 -0
  713. package/dist/schema/nodes/stair-types.js +23 -0
  714. package/dist/schema/nodes/stair.d.ts +51 -75
  715. package/dist/schema/nodes/stair.d.ts.map +1 -1
  716. package/dist/schema/nodes/stair.js +6 -20
  717. package/dist/schema/nodes/structural-grid.d.ts +8 -8
  718. package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -2
  719. package/dist/schema/nodes/turbine-vent.d.ts +13 -13
  720. package/dist/schema/nodes/unit.d.ts +10 -10
  721. package/dist/schema/nodes/unit.d.ts.map +1 -1
  722. package/dist/schema/nodes/wall.d.ts +479 -146
  723. package/dist/schema/nodes/wall.d.ts.map +1 -1
  724. package/dist/schema/nodes/wall.js +19 -0
  725. package/dist/schema/nodes/window.d.ts +55 -39
  726. package/dist/schema/nodes/window.d.ts.map +1 -1
  727. package/dist/schema/nodes/window.js +10 -0
  728. package/dist/schema/nodes/zone.d.ts +231 -12
  729. package/dist/schema/nodes/zone.d.ts.map +1 -1
  730. package/dist/schema/nodes/zone.js +10 -0
  731. package/dist/schema/provenance.d.ts +21 -21
  732. package/dist/schema/scene-material.d.ts +5 -5
  733. package/dist/schema/site-presentation.d.ts +100 -0
  734. package/dist/schema/site-presentation.d.ts.map +1 -0
  735. package/dist/schema/site-presentation.js +83 -0
  736. package/dist/schema/types.d.ts +1954 -1414
  737. package/dist/schema/types.d.ts.map +1 -1
  738. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -1
  739. package/dist/services/index.d.ts +5 -1
  740. package/dist/services/index.d.ts.map +1 -1
  741. package/dist/services/index.js +5 -1
  742. package/dist/services/level-height.d.ts.map +1 -1
  743. package/dist/services/level-height.js +7 -3
  744. package/dist/services/port-connectivity.d.ts +4 -0
  745. package/dist/services/port-connectivity.d.ts.map +1 -1
  746. package/dist/services/port-connectivity.js +35 -0
  747. package/dist/services/project-file-sink.d.ts +9 -0
  748. package/dist/services/project-file-sink.d.ts.map +1 -0
  749. package/dist/services/project-file-sink.js +13 -0
  750. package/dist/services/roof-bearing.d.ts +62 -0
  751. package/dist/services/roof-bearing.d.ts.map +1 -0
  752. package/dist/services/roof-bearing.js +234 -0
  753. package/dist/services/roof-level.d.ts +121 -0
  754. package/dist/services/roof-level.d.ts.map +1 -0
  755. package/dist/services/roof-level.js +280 -0
  756. package/dist/services/roof-move.d.ts +83 -0
  757. package/dist/services/roof-move.d.ts.map +1 -0
  758. package/dist/services/roof-move.js +316 -0
  759. package/dist/services/stair-surface-snap.d.ts +14 -0
  760. package/dist/services/stair-surface-snap.d.ts.map +1 -0
  761. package/dist/services/stair-surface-snap.js +116 -0
  762. package/dist/services/storey-datum.d.ts +12 -0
  763. package/dist/services/storey-datum.d.ts.map +1 -0
  764. package/dist/services/storey-datum.js +18 -0
  765. package/dist/services/storey.d.ts +51 -5
  766. package/dist/services/storey.d.ts.map +1 -1
  767. package/dist/services/storey.js +125 -8
  768. package/dist/solar-panel-presets.d.ts +2 -2
  769. package/dist/store/actions/node-actions.d.ts +3613 -3182
  770. package/dist/store/actions/node-actions.d.ts.map +1 -1
  771. package/dist/store/actions/node-actions.js +46 -1
  772. package/dist/store/derived-node-guard.d.ts.map +1 -1
  773. package/dist/store/history-control.d.ts +39 -0
  774. package/dist/store/history-control.d.ts.map +1 -1
  775. package/dist/store/history-control.js +84 -4
  776. package/dist/store/scene-annotations.d.ts +7267 -6409
  777. package/dist/store/scene-annotations.d.ts.map +1 -1
  778. package/dist/store/scene-preview.d.ts +16 -0
  779. package/dist/store/scene-preview.d.ts.map +1 -0
  780. package/dist/store/scene-preview.js +144 -0
  781. package/dist/store/use-live-node-overrides.d.ts.map +1 -1
  782. package/dist/store/use-live-terrain.d.ts.map +1 -1
  783. package/dist/store/use-live-transforms.d.ts.map +1 -1
  784. package/dist/store/use-scene.d.ts.map +1 -1
  785. package/dist/store/use-scene.js +37 -4
  786. package/dist/systems/elevator/elevator-dispatch.js +1 -1
  787. package/dist/systems/fence/fence-features.d.ts.map +1 -1
  788. package/dist/systems/owned-floor-openings.d.ts.map +1 -1
  789. package/dist/systems/owned-floor-openings.js +24 -3
  790. package/dist/systems/roof/roof-elevation-system.d.ts.map +1 -1
  791. package/dist/systems/roof/roof-elevation-system.js +9 -3
  792. package/dist/systems/roof/roof-elevation.d.ts +5 -0
  793. package/dist/systems/roof/roof-elevation.d.ts.map +1 -1
  794. package/dist/systems/roof/roof-elevation.js +91 -62
  795. package/dist/systems/slab/__fixtures__/floor-step.d.ts +4623 -3516
  796. package/dist/systems/slab/__fixtures__/floor-step.d.ts.map +1 -1
  797. package/dist/systems/slab/__fixtures__/raised-room.d.ts +5149 -4076
  798. package/dist/systems/slab/__fixtures__/raised-room.d.ts.map +1 -1
  799. package/dist/systems/slab/slab-support.d.ts +6 -3
  800. package/dist/systems/slab/slab-support.d.ts.map +1 -1
  801. package/dist/systems/slab/slab-support.js +78 -10
  802. package/dist/systems/stair/stair-detail-budget.d.ts +2 -2
  803. package/dist/systems/stair/stair-detail-budget.d.ts.map +1 -1
  804. package/dist/systems/stair/stair-footprint.d.ts +6 -0
  805. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  806. package/dist/systems/stair/stair-footprint.js +27 -14
  807. package/dist/systems/stair/stair-layout.d.ts +2 -2
  808. package/dist/systems/stair/stair-opening-preview.d.ts +3643 -3214
  809. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  810. package/dist/systems/stair/stair-presets.d.ts +73 -65
  811. package/dist/systems/stair/stair-presets.d.ts.map +1 -1
  812. package/dist/systems/stair/stair-presets.js +16 -9
  813. package/dist/systems/stair/stair-rail-path.d.ts +1 -1
  814. package/dist/systems/stair/stair-rise-query.d.ts +16 -0
  815. package/dist/systems/stair/stair-rise-query.d.ts.map +1 -1
  816. package/dist/systems/stair/stair-rise-query.js +57 -7
  817. package/dist/systems/stair/stair-sizing.d.ts +101 -99
  818. package/dist/systems/stair/stair-sizing.d.ts.map +1 -1
  819. package/dist/systems/wall/wall-assembly.d.ts +11 -0
  820. package/dist/systems/wall/wall-assembly.d.ts.map +1 -1
  821. package/dist/systems/wall/wall-assembly.js +21 -0
  822. package/dist/systems/wall/wall-curve.d.ts +5 -0
  823. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  824. package/dist/systems/wall/wall-curve.js +13 -0
  825. package/dist/systems/wall/wall-frame.d.ts.map +1 -1
  826. package/dist/systems/wall/wall-frame.js +8 -0
  827. package/dist/systems/wall/wall-room-sides.d.ts +8 -0
  828. package/dist/systems/wall/wall-room-sides.d.ts.map +1 -1
  829. package/dist/systems/wall/wall-room-sides.js +60 -7
  830. package/dist/systems/wall/wall-top.d.ts +7 -4
  831. package/dist/systems/wall/wall-top.d.ts.map +1 -1
  832. package/dist/systems/wall/wall-top.js +14 -6
  833. package/dist/systems/wall/wall-topology.d.ts +4 -0
  834. package/dist/systems/wall/wall-topology.d.ts.map +1 -1
  835. package/dist/systems/wall/wall-topology.js +4 -2
  836. package/dist/systems/wall/wall-trim.d.ts +7 -0
  837. package/dist/systems/wall/wall-trim.d.ts.map +1 -0
  838. package/dist/systems/wall/wall-trim.js +10 -0
  839. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  840. package/dist/utils/clone-scene-graph.js +8 -0
  841. package/dist/utils/ensure-scene-openings.d.ts +7420 -6562
  842. package/dist/utils/ensure-scene-openings.d.ts.map +1 -1
  843. package/dist/utils/floor-piece-adoption.d.ts +2 -2
  844. package/dist/utils/floor-plate-migration.d.ts +3746 -3317
  845. package/dist/utils/floor-plate-migration.d.ts.map +1 -1
  846. package/dist/utils/floor-plate-migration.js +2 -2
  847. package/dist/utils/heal-scene-graph.d.ts +12 -0
  848. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  849. package/dist/utils/heal-scene-graph.js +40 -23
  850. package/dist/utils/legacy-wall-datums.d.ts.map +1 -1
  851. package/dist/utils/legacy-wall-datums.js +2 -2
  852. package/dist/utils/owned-floor-opening-migration.d.ts +3642 -3213
  853. package/dist/utils/owned-floor-opening-migration.d.ts.map +1 -1
  854. package/dist/utils/reconcile-structure-on-load.d.ts +3730 -7777
  855. package/dist/utils/reconcile-structure-on-load.d.ts.map +1 -1
  856. package/dist/utils/scene-migrations.d.ts +1 -1
  857. package/dist/utils/scene-migrations.d.ts.map +1 -1
  858. package/dist/utils/scene-migrations.js +1 -1
  859. package/dist/utils/semantic-equal.d.ts +3 -0
  860. package/dist/utils/semantic-equal.d.ts.map +1 -0
  861. package/dist/utils/semantic-equal.js +26 -0
  862. package/dist/utils/structure-id.d.ts.map +1 -1
  863. package/dist/utils/types.d.ts.map +1 -1
  864. package/dist/utils/wall-face-migration.d.ts +1 -1
  865. package/dist/utils/wall-face-migration.d.ts.map +1 -1
  866. package/package.json +36 -10
@@ -0,0 +1,404 @@
1
+ /**
2
+ * Straightening a photo of a flat face: the plane-to-plane perspective transform (a homography)
3
+ * between metres on the face and pixels in the photo, and the warp that draws the face head-on.
4
+ * Several faces of one photo share its camera: the vanishing points of their lines give its focal
5
+ * length and rotation, and each face's homography is K·[along up origin].
6
+ * Pure over numbers and RGBA buffers, so the chat (canvas) and the MCP (any codec) share it.
7
+ */
8
+ export function applyHomography(h, [x, y]) {
9
+ const w = h[6] * x + h[7] * y + h[8];
10
+ if (Math.abs(w) < 1e-12)
11
+ return null;
12
+ return [(h[0] * x + h[1] * y + h[2]) / w, (h[3] * x + h[4] * y + h[5]) / w];
13
+ }
14
+ export function multiplyHomography(a, b) {
15
+ const m = [];
16
+ for (let r = 0; r < 3; r++)
17
+ for (let c = 0; c < 3; c++)
18
+ m.push(a[r * 3] * b[c] + a[r * 3 + 1] * b[3 + c] + a[r * 3 + 2] * b[6 + c]);
19
+ return m;
20
+ }
21
+ export function invertHomography(h) {
22
+ const [a, b, c, d, e, f, g, i, j] = h;
23
+ const co = [
24
+ e * j - f * i,
25
+ -(b * j - c * i),
26
+ b * f - c * e,
27
+ -(d * j - f * g),
28
+ a * j - c * g,
29
+ -(a * f - c * d),
30
+ d * i - e * g,
31
+ -(a * i - b * g),
32
+ a * e - b * d,
33
+ ];
34
+ const det = a * co[0] + b * co[3] + c * co[6];
35
+ if (Math.abs(det) < 1e-12)
36
+ return null;
37
+ const inverse = co.map((value) => value / det);
38
+ return normalised(inverse);
39
+ }
40
+ function normalised(h) {
41
+ const scale = h[8];
42
+ if (Math.abs(scale) < 1e-12 || !h.every(Number.isFinite))
43
+ return null;
44
+ return h.map((value) => value / scale);
45
+ }
46
+ /** Moves points to their centroid and scales them to an average distance of √2 (Hartley). */
47
+ function conditioning(points) {
48
+ const cx = points.reduce((sum, [x]) => sum + x, 0) / points.length;
49
+ const cy = points.reduce((sum, [, y]) => sum + y, 0) / points.length;
50
+ const mean = points.reduce((sum, [x, y]) => sum + Math.hypot(x - cx, y - cy), 0) / points.length;
51
+ const s = mean > 1e-12 ? Math.SQRT2 / mean : 1;
52
+ return [s, 0, -s * cx, 0, s, -s * cy, 0, 0, 1];
53
+ }
54
+ /** Gaussian elimination with partial pivoting; null when the system is singular. */
55
+ function solveLinear(a, b) {
56
+ const n = b.length;
57
+ const m = a.map((row, i) => [...row, b[i]]);
58
+ const scale = Math.max(...m.map((row, i) => Math.abs(row[i])), 1e-300);
59
+ for (let col = 0; col < n; col++) {
60
+ let pivot = col;
61
+ for (let row = col + 1; row < n; row++)
62
+ if (Math.abs(m[row][col]) > Math.abs(m[pivot][col]))
63
+ pivot = row;
64
+ if (Math.abs(m[pivot][col]) < 1e-10 * scale)
65
+ return null;
66
+ [m[col], m[pivot]] = [m[pivot], m[col]];
67
+ for (let row = 0; row < n; row++) {
68
+ if (row === col)
69
+ continue;
70
+ const factor = m[row][col] / m[col][col];
71
+ for (let k = col; k <= n; k++)
72
+ m[row][k] -= factor * m[col][k];
73
+ }
74
+ }
75
+ return m.map((row, i) => row[n] / row[i]);
76
+ }
77
+ /**
78
+ * The homography taking each `from` to its `to`, fitted over all pairs by least squares on
79
+ * conditioned coordinates, so one point picked a few pixels off moves the fit, not breaks it.
80
+ * Null for fewer than four pairs or points that do not span the plane.
81
+ */
82
+ export function solveHomography(pairs) {
83
+ if (pairs.length < 4)
84
+ return null;
85
+ const tFrom = conditioning(pairs.map((pair) => pair.from));
86
+ const tTo = conditioning(pairs.map((pair) => pair.to));
87
+ const ata = Array.from({ length: 8 }, () => new Array(8).fill(0));
88
+ const atb = new Array(8).fill(0);
89
+ const accumulate = (row, value) => {
90
+ for (let i = 0; i < 8; i++) {
91
+ atb[i] += row[i] * value;
92
+ for (let j = 0; j < 8; j++)
93
+ ata[i][j] += row[i] * row[j];
94
+ }
95
+ };
96
+ for (const { from, to } of pairs) {
97
+ const [x, y] = applyHomography(tFrom, from);
98
+ const [u, v] = applyHomography(tTo, to);
99
+ accumulate([x, y, 1, 0, 0, 0, -u * x, -u * y], u);
100
+ accumulate([0, 0, 0, x, y, 1, -v * x, -v * y], v);
101
+ }
102
+ const solved = solveLinear(ata, atb);
103
+ if (!solved)
104
+ return null;
105
+ const conditioned = [...solved, 1];
106
+ const tToInverse = invertHomography(tTo);
107
+ if (!tToInverse)
108
+ return null;
109
+ return normalised(multiplyHomography(multiplyHomography(tToInverse, conditioned), tFrom));
110
+ }
111
+ /** Where the lines through `a` and through `b` cross; null when they are parallel. */
112
+ export function lineIntersection(a, b) {
113
+ const [[x1, y1], [x2, y2]] = a;
114
+ const [[x3, y3], [x4, y4]] = b;
115
+ const denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
116
+ const size = Math.max(Math.hypot(x2 - x1, y2 - y1) * Math.hypot(x4 - x3, y4 - y3), 1e-300);
117
+ if (Math.abs(denominator) < 1e-9 * size)
118
+ return null;
119
+ const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denominator;
120
+ return [x1 + t * (x2 - x1), y1 + t * (y2 - y1)];
121
+ }
122
+ const dot3 = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
123
+ const cross3 = (a, b) => [
124
+ a[1] * b[2] - a[2] * b[1],
125
+ a[2] * b[0] - a[0] * b[2],
126
+ a[0] * b[1] - a[1] * b[0],
127
+ ];
128
+ const scale3 = (a, s) => [a[0] * s, a[1] * s, a[2] * s];
129
+ const add3 = (a, b) => [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
130
+ function unit3(a) {
131
+ const n = Math.hypot(a[0], a[1], a[2]);
132
+ return n > 1e-12 && Number.isFinite(n) ? scale3(a, 1 / n) : null;
133
+ }
134
+ /** Eigenvalues ascending, with their unit eigenvectors, of a symmetric 3 × 3 (cyclic Jacobi). */
135
+ function symmetricEigen(m) {
136
+ const a = m.map((row) => [...row]);
137
+ const v = [
138
+ [1, 0, 0],
139
+ [0, 1, 0],
140
+ [0, 0, 1],
141
+ ];
142
+ for (let sweep = 0; sweep < 64; sweep++) {
143
+ const off = a[0][1] ** 2 + a[0][2] ** 2 + a[1][2] ** 2;
144
+ const diagonal = a[0][0] ** 2 + a[1][1] ** 2 + a[2][2] ** 2;
145
+ if (off <= 1e-30 * diagonal || off === 0)
146
+ break;
147
+ for (const [p, q] of [
148
+ [0, 1],
149
+ [0, 2],
150
+ [1, 2],
151
+ ]) {
152
+ if (Math.abs(a[p][q]) < 1e-300)
153
+ continue;
154
+ const theta = (a[q][q] - a[p][p]) / (2 * a[p][q]);
155
+ const t = (theta >= 0 ? 1 : -1) / (Math.abs(theta) + Math.sqrt(theta * theta + 1));
156
+ const c = 1 / Math.sqrt(t * t + 1);
157
+ const s = t * c;
158
+ for (let k = 0; k < 3; k++) {
159
+ const [kp, kq] = [a[k][p], a[k][q]];
160
+ a[k][p] = c * kp - s * kq;
161
+ a[k][q] = s * kp + c * kq;
162
+ }
163
+ for (let k = 0; k < 3; k++) {
164
+ const [pk, qk] = [a[p][k], a[q][k]];
165
+ a[p][k] = c * pk - s * qk;
166
+ a[q][k] = s * pk + c * qk;
167
+ }
168
+ for (let k = 0; k < 3; k++) {
169
+ const [kp, kq] = [v[k][p], v[k][q]];
170
+ v[k][p] = c * kp - s * kq;
171
+ v[k][q] = s * kp + c * kq;
172
+ }
173
+ }
174
+ }
175
+ return [0, 1, 2]
176
+ .map((i) => ({ value: a[i][i], vector: [v[0][i], v[1][i], v[2][i]] }))
177
+ .sort((x, y) => x.value - y.value);
178
+ }
179
+ /**
180
+ * Where lines that are parallel on the building meet in the photo: their vanishing point, as a unit
181
+ * homogeneous point (x, y, w) about the photo's centre with its longer side as unit, so lines
182
+ * parallel in the photo give w = 0 (a point at infinity) instead of a division by zero. Least
183
+ * squares over all the lines, each weighted by its length. Null for fewer than two distinct lines.
184
+ */
185
+ export function vanishingPoint(segments, photo) {
186
+ const unit = Math.max(photo.width, photo.height);
187
+ const at = ([x, y]) => [(x - photo.width / 2) / unit, (y - photo.height / 2) / unit, 1];
188
+ const m = [0, 1, 2].map(() => [0, 0, 0]);
189
+ for (const [a, b] of segments) {
190
+ const line = cross3(at(a), at(b));
191
+ // |line.xy| is the segment's length: dividing by it once leaves the length as the weight.
192
+ const length = Math.hypot(line[0], line[1]);
193
+ if (length < 1e-12)
194
+ continue;
195
+ for (let i = 0; i < 3; i++)
196
+ for (let j = 0; j < 3; j++)
197
+ m[i][j] += (line[i] * line[j]) / length;
198
+ }
199
+ const [smallest, middle, largest] = symmetricEigen(m);
200
+ // Two near-identical lines (the same corner picked twice) cross anywhere: no vanishing point.
201
+ if (!(middle.value > 1e-5 * largest.value))
202
+ return null;
203
+ const point = smallest.vector;
204
+ return point[2] < 0 ? scale3(point, -1) : point;
205
+ }
206
+ /** Root mean square distance, in photo pixels, of each segment's ends from the line through its middle and `direction`'s vanishing point. */
207
+ export function vanishingResidualPx(camera, direction, segments) {
208
+ if (!segments.length)
209
+ return 0;
210
+ const point = [
211
+ camera.focal * direction[0] + camera.centre[0] * direction[2],
212
+ camera.focal * direction[1] + camera.centre[1] * direction[2],
213
+ direction[2],
214
+ ];
215
+ let sum = 0;
216
+ for (const [a, b] of segments) {
217
+ const line = cross3([(a[0] + b[0]) / 2, (a[1] + b[1]) / 2, 1], point);
218
+ const norm = Math.hypot(line[0], line[1]) || 1;
219
+ for (const [x, y] of [a, b])
220
+ sum += ((line[0] * x + line[1] * y + line[2]) / norm) ** 2;
221
+ }
222
+ return Math.sqrt(sum / (segments.length * 2));
223
+ }
224
+ /** A focal length below a quarter or above ten times the photo's longer side is no photo's. */
225
+ const FOCAL_RANGE = [0.25, 10];
226
+ /** How much the perpendicular pairs must say about the focal length, at least. */
227
+ const MIN_PAIR_WEIGHT = 0.02;
228
+ /** The principal point stays within this many longer sides of the centre, up or down. */
229
+ const MAX_SHIFT = 1;
230
+ /**
231
+ * The focal length and the principal point's height (in units of the photo's longer side, from
232
+ * its centre) that make each pair of perpendicular directions perpendicular. With the principal
233
+ * point at (0, c), a pair of vanishing points gives (x₁, y₁ − c·w₁, f·w₁)·(x₂, y₂ − c·w₂, f·w₂) = 0,
234
+ * linear in c and g = f² + c²: −(y₁w₂ + y₂w₁)·c + w₁w₂·g = −(x₁x₂ + y₁y₂). Least squares over the
235
+ * pairs; a vanishing point far out has a small w and says little about f. With the verticals
236
+ * parallel (w = 0) their pairs put c on the horizon. Too few or too alike pairs keep c = 0.
237
+ */
238
+ function focalAndCentre(pairs) {
239
+ const rows = pairs.map(([a, b]) => ({
240
+ c: -(a[1] * b[2] + b[1] * a[2]),
241
+ g: a[2] * b[2],
242
+ rhs: -(a[0] * b[0] + a[1] * b[1]),
243
+ }));
244
+ const sum = (term) => rows.reduce((total, row) => total + term(row), 0);
245
+ const weight = Math.sqrt(sum((row) => row.g * row.g));
246
+ const [cc, cg, gg] = [sum((r) => r.c * r.c), sum((r) => r.c * r.g), sum((r) => r.g * r.g)];
247
+ const [cr, gr] = [sum((r) => r.c * r.rhs), sum((r) => r.g * r.rhs)];
248
+ const determinant = cc * gg - cg * cg;
249
+ let centre = 0;
250
+ let squared = gr / gg;
251
+ if (rows.length > 1 && determinant > 1e-3 * cc * gg) {
252
+ const c = (cr * gg - gr * cg) / determinant;
253
+ const g = (gr * cc - cr * cg) / determinant;
254
+ if (Math.abs(c) <= MAX_SHIFT && g - c * c > 0) {
255
+ centre = c;
256
+ squared = g - c * c;
257
+ }
258
+ }
259
+ // Each well-placed pair's focal length on its own, at that centre: they agree when the picks do.
260
+ const alone = rows
261
+ .filter((row) => Math.abs(row.g) > 0.05)
262
+ .map((row) => (row.rhs - row.c * centre) / row.g - centre * centre)
263
+ .filter((value) => value > 0)
264
+ .map(Math.sqrt);
265
+ return { weight, focal: Math.sqrt(squared), centre, alone };
266
+ }
267
+ /**
268
+ * The photo's camera from vanishing points (from `vanishingPoint`): the vertical one when the
269
+ * verticals were picked, one per face, and which faces meet at a right angle. First the focal
270
+ * length and the principal point's height (`focalAndCentre`), then the rotation: up from the
271
+ * verticals (or across two faces), each face's direction from its vanishing point, made level, and
272
+ * turned so the face looks at the camera (`probe` is a photo pixel on it). `focalSpread` is the
273
+ * ratio between the largest and the smallest focal length the well-placed pairs give on their own:
274
+ * 1 when they agree.
275
+ */
276
+ export function solvePhotoCamera(input) {
277
+ const { photo, vertical, faces } = input;
278
+ const pairs = [
279
+ ...(vertical ? faces.map((face) => [vertical, face.vanishing]) : []),
280
+ ...input.perpendicular.map(([i, j]) => [faces[i].vanishing, faces[j].vanishing]),
281
+ ];
282
+ if (!pairs.length)
283
+ return { failure: 'needs_second_direction' };
284
+ const { weight, focal, centre, alone } = focalAndCentre(pairs);
285
+ if (weight < MIN_PAIR_WEIGHT)
286
+ return { failure: 'at_infinity' };
287
+ if (!(focal >= FOCAL_RANGE[0] && focal <= FOCAL_RANGE[1]))
288
+ return { failure: 'unsolved' };
289
+ const direction = (v) => unit3([v[0], v[1] - centre * v[2], focal * v[2]]);
290
+ const directions = faces.map((face) => direction(face.vanishing));
291
+ const [i, j] = input.perpendicular[0] ?? [];
292
+ let up = (vertical && direction(vertical)) ??
293
+ (i !== undefined && directions[i] && directions[j]
294
+ ? unit3(cross3(directions[i], directions[j]))
295
+ : null);
296
+ if (!up)
297
+ return { failure: 'unsolved' };
298
+ if (up[1] > 0)
299
+ up = scale3(up, -1);
300
+ const unitPx = Math.max(photo.width, photo.height);
301
+ const camera = {
302
+ ...photo,
303
+ focal: focal * unitPx,
304
+ centre: [photo.width / 2, photo.height / 2 + centre * unitPx],
305
+ up,
306
+ };
307
+ const axes = [];
308
+ for (const [index, face] of faces.entries()) {
309
+ const raw = directions[index];
310
+ let along = raw && unit3(add3(raw, scale3(up, -dot3(raw, up))));
311
+ if (!along)
312
+ return { failure: 'unsolved' };
313
+ let normal = cross3(along, up);
314
+ if (dot3(normal, photoRay(camera, face.probe)) > 0) {
315
+ along = scale3(along, -1);
316
+ normal = scale3(normal, -1);
317
+ }
318
+ axes.push({ along, up, normal });
319
+ }
320
+ const focalSpread = alone.length > 1 ? Math.max(...alone) / Math.min(...alone) : 1;
321
+ return { camera, faces: axes, focalSpread };
322
+ }
323
+ /** The ray from the camera through a photo pixel, in camera coordinates (its depth is 1). */
324
+ export function photoRay(camera, [x, y]) {
325
+ return [(x - camera.centre[0]) / camera.focal, (y - camera.centre[1]) / camera.focal, 1];
326
+ }
327
+ /** Where a photo pixel's ray meets a face's plane, in camera coordinates; null behind the camera. */
328
+ export function pointOnFace(camera, face, pixel) {
329
+ const ray = photoRay(camera, pixel);
330
+ const depth = face.distance / dot3(face.normal, ray);
331
+ return depth > 0 && Number.isFinite(depth) ? scale3(ray, depth) : null;
332
+ }
333
+ /** A photo pixel's place on a face, (along, up) in the face's units, from where its normal meets it. */
334
+ export function faceCoordinates(camera, face, pixel) {
335
+ const point = pointOnFace(camera, face, pixel);
336
+ return point && [dot3(face.along, point), dot3(face.up, point)];
337
+ }
338
+ /**
339
+ * The plane of a face from the camera and its two vertical edges `width` apart (the walls' extent):
340
+ * the one distance that puts them so far apart. Null when the edges come out the wrong way round.
341
+ */
342
+ export function faceAtWidth(camera, axes, edges, width) {
343
+ const across = (points) => points.reduce((sum, pixel) => {
344
+ const ray = photoRay(camera, pixel);
345
+ return sum + dot3(axes.along, ray) / dot3(axes.normal, ray);
346
+ }, 0) / points.length;
347
+ const distance = width / (across(edges.right) - across(edges.left));
348
+ return distance < 0 && Number.isFinite(distance) ? { ...axes, distance } : null;
349
+ }
350
+ /** The plane of a face through the corner it shares with another: `corner` is that edge's pixels. */
351
+ export function faceThroughCorner(camera, axes, other, corner) {
352
+ const points = corner.map((pixel) => pointOnFace(camera, other, pixel));
353
+ if (points.some((point) => !point))
354
+ return null;
355
+ const middle = scale3(points.reduce((sum, point) => add3(sum, point), [0, 0, 0]), 1 / points.length);
356
+ const distance = dot3(axes.normal, middle);
357
+ return distance < 0 ? { ...axes, distance } : null;
358
+ }
359
+ /**
360
+ * Metres on a face, from `origin` (its face coordinates), to photo pixels: K·[along up origin].
361
+ * Its third row is the depth in metres, so a point behind the camera has w < 0.
362
+ */
363
+ export function cameraFaceHomography(camera, face, origin) {
364
+ const offset = add3(add3(scale3(face.along, origin[0]), scale3(face.up, origin[1])), scale3(face.normal, face.distance));
365
+ const [a, u, t] = [face.along, face.up, offset].map((v) => [
366
+ camera.focal * v[0] + camera.centre[0] * v[2],
367
+ camera.focal * v[1] + camera.centre[1] * v[2],
368
+ v[2],
369
+ ]);
370
+ return [a[0], u[0], t[0], a[1], u[1], t[1], a[2], u[2], t[2]];
371
+ }
372
+ /**
373
+ * An image `width` × `height` whose every pixel samples `src` (bilinear) where `toSource` maps
374
+ * its centre. What falls outside the source stays transparent.
375
+ */
376
+ export function warpImage(src, toSource, width, height) {
377
+ const out = new Uint8ClampedArray(width * height * 4);
378
+ const { width: sw, height: sh, data } = src;
379
+ for (let v = 0; v < height; v++) {
380
+ for (let u = 0; u < width; u++) {
381
+ const w = toSource[6] * (u + 0.5) + toSource[7] * (v + 0.5) + toSource[8];
382
+ // Behind the camera: a face running past the photo's side would wrap round.
383
+ if (w < 1e-12)
384
+ continue;
385
+ const sx = (toSource[0] * (u + 0.5) + toSource[1] * (v + 0.5) + toSource[2]) / w - 0.5;
386
+ const sy = (toSource[3] * (u + 0.5) + toSource[4] * (v + 0.5) + toSource[5]) / w - 0.5;
387
+ if (sx < -0.5 || sy < -0.5 || sx > sw - 0.5 || sy > sh - 0.5)
388
+ continue;
389
+ const x0 = Math.max(0, Math.min(sw - 1, Math.floor(sx)));
390
+ const y0 = Math.max(0, Math.min(sh - 1, Math.floor(sy)));
391
+ const x1 = Math.min(sw - 1, x0 + 1);
392
+ const y1 = Math.min(sh - 1, y0 + 1);
393
+ const fx = Math.max(0, Math.min(1, sx - x0));
394
+ const fy = Math.max(0, Math.min(1, sy - y0));
395
+ const o = (v * width + u) * 4;
396
+ for (let c = 0; c < 4; c++) {
397
+ const top = data[(y0 * sw + x0) * 4 + c] * (1 - fx) + data[(y0 * sw + x1) * 4 + c] * fx;
398
+ const bottom = data[(y1 * sw + x0) * 4 + c] * (1 - fx) + data[(y1 * sw + x1) * 4 + c] * fx;
399
+ out[o + c] = Math.round(top * (1 - fy) + bottom * fy);
400
+ }
401
+ }
402
+ }
403
+ return { width, height, data: out };
404
+ }
@@ -0,0 +1,13 @@
1
+ import type { WallNode } from '../schema/index.js';
2
+ type Pt = [number, number];
3
+ /**
4
+ * The walls that close every gap a plan's walls leave, whatever opening each takes: a storey's
5
+ * outline for its roof, whether or not its doors and windows are in yet.
6
+ */
7
+ export declare function gapBridges(walls: readonly WallNode[]): {
8
+ start: Pt;
9
+ end: Pt;
10
+ thickness: number;
11
+ }[];
12
+ export {};
13
+ //# sourceMappingURL=wall-gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wall-gaps.d.ts","sourceRoot":"","sources":["../../src/building/wall-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAEzC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAsJ1B;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE;;;;IAMpD"}
@@ -0,0 +1,158 @@
1
+ /** Wall ends this close are joined. */
2
+ const JOIN = 0.05;
3
+ /** The narrowest gap a door or window leaves. */
4
+ const MIN_GAP = 0.6;
5
+ /** On the outside: up to a garage door or a stacking slider. */
6
+ const MAX_OUTSIDE = 5;
7
+ /** Two gaps closer than this, side by side, are one opening found from two wall ends. */
8
+ const DUPLICATE = 0.5;
9
+ const sub = (a, b) => [a[0] - b[0], a[1] - b[1]];
10
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1];
11
+ const cross = (a, b) => a[0] * b[1] - a[1] * b[0];
12
+ const round = (value) => Math.round(value * 1e6) / 1e6;
13
+ const at = (p, u, s) => [
14
+ round(p[0] + u[0] * s),
15
+ round(p[1] + u[1] * s),
16
+ ];
17
+ const same = (p, q) => Math.hypot(q[0] - p[0], q[1] - p[1]) < JOIN;
18
+ function unit(wall) {
19
+ const [dx, dz] = sub(wall.end, wall.start);
20
+ const length = Math.hypot(dx, dz);
21
+ return [dx / length, dz / length];
22
+ }
23
+ /**
24
+ * How a wall end meets the others. Closed: a wall carries on in line from it, or it runs into
25
+ * another wall's side. Cornered: another wall turns there (a partition ending at an outside wall's
26
+ * jamb leaves the gap open: Hawkesbury's laundry door).
27
+ */
28
+ function endOf(p, self, walls) {
29
+ let cornered = false;
30
+ for (const other of walls) {
31
+ if (other === self)
32
+ continue;
33
+ const u = unit(other);
34
+ if (same(other.start, p) || same(other.end, p)) {
35
+ if (Math.abs(cross(u, unit(self))) < 0.05)
36
+ return 'closed';
37
+ cornered = true;
38
+ continue;
39
+ }
40
+ const v = sub(p, other.start);
41
+ const along = dot(v, u);
42
+ const length = Math.hypot(...sub(other.end, other.start));
43
+ if (along > JOIN &&
44
+ along < length - JOIN &&
45
+ Math.abs(cross(u, v)) <= (other.thickness ?? 0.2) / 2 + JOIN)
46
+ return 'closed';
47
+ }
48
+ return cornered ? 'cornered' : 'free';
49
+ }
50
+ /**
51
+ * Where a plan's walls leave a gap for an opening: a wall end facing, in line, the end of another
52
+ * wall, or a partition stopping short of the wall it runs to. Found once each.
53
+ */
54
+ function gapCandidates(walls) {
55
+ const straight = walls.filter((wall) => !wall.curveOffset && Math.hypot(...sub(wall.end, wall.start)) > JOIN);
56
+ const found = new Map();
57
+ for (const wall of straight) {
58
+ const u = unit(wall);
59
+ for (const [p, out] of [
60
+ [wall.end, u],
61
+ [wall.start, [-u[0], -u[1]]],
62
+ ]) {
63
+ const end = endOf(p, wall, straight);
64
+ if (end === 'closed')
65
+ continue;
66
+ // The nearest thing ahead: a wall end in line, or a wall across the way.
67
+ let nearest = null;
68
+ for (const other of straight) {
69
+ if (other === wall)
70
+ continue;
71
+ const w = unit(other);
72
+ const half = (wall.thickness ?? 0.2) / 2;
73
+ if (Math.abs(cross(u, w)) < 0.05) {
74
+ for (const q of [other.start, other.end]) {
75
+ const v = sub(q, p);
76
+ const s = dot(v, out);
77
+ if (s > JOIN && Math.abs(cross(out, v)) < Math.max(half, (other.thickness ?? 0.2) / 2))
78
+ if (!nearest || s < nearest.s)
79
+ nearest = { s, end: [q[0], q[1]], to: other, clear: s, atEnd: true };
80
+ }
81
+ continue;
82
+ }
83
+ if (Math.abs(cross(out, w)) < 0.5)
84
+ continue;
85
+ const v = sub(other.start, p);
86
+ const s = cross(v, w) / cross(out, w);
87
+ const t = cross(v, out) / cross(out, w);
88
+ const length = Math.hypot(...sub(other.end, other.start));
89
+ // The ray meets the wall's body, which reaches half its thickness past its centreline's end.
90
+ const reach = Math.max(JOIN, (other.thickness ?? 0.2) / 2);
91
+ if (s <= JOIN || t < -reach || t > length + reach)
92
+ continue;
93
+ const clear = s - (other.thickness ?? 0.2) / 2;
94
+ if (!nearest || s < nearest.s)
95
+ nearest = {
96
+ s,
97
+ end: at(p, out, s),
98
+ to: other,
99
+ clear,
100
+ atEnd: t < reach || t > length - reach,
101
+ };
102
+ }
103
+ if (!nearest || nearest.clear < MIN_GAP - 1e-9 || nearest.clear > MAX_OUTSIDE + 1e-9)
104
+ continue;
105
+ // From a corner, only a gap that ends at a wall end: the outside past a building's corner
106
+ // runs to whatever wall lies across it.
107
+ if (end === 'cornered' && !nearest.atEnd)
108
+ continue;
109
+ const start = [p[0], p[1]];
110
+ const key = [start, nearest.end]
111
+ .map((q) => `${Math.round(q[0] * 100)},${Math.round(q[1] * 100)}`)
112
+ .sort()
113
+ .join('|');
114
+ if (found.has(key))
115
+ continue;
116
+ found.set(key, {
117
+ start,
118
+ end: nearest.end,
119
+ // In line, the gap belongs to the thicker of its two walls (an outside wall's last jamb is
120
+ // often a thin stub); across, to the wall it starts from.
121
+ thickness: Math.abs(cross(u, unit(nearest.to))) < 0.05
122
+ ? Math.max(wall.thickness ?? 0.2, nearest.to.thickness ?? 0.2)
123
+ : (wall.thickness ?? 0.2),
124
+ clear: nearest.clear,
125
+ });
126
+ }
127
+ }
128
+ // One gap per opening: two wall ends a few centimetres apart find it twice.
129
+ const candidates = [];
130
+ for (const gap of [...found.values()].sort((a, b) => a.clear - b.clear)) {
131
+ const centre = mid(gap);
132
+ const direction = unitOf(gap);
133
+ if (!candidates.some((kept) => Math.hypot(...sub(mid(kept), centre)) < DUPLICATE &&
134
+ Math.abs(cross(unitOf(kept), direction)) < 0.1))
135
+ candidates.push(gap);
136
+ }
137
+ return candidates;
138
+ }
139
+ /**
140
+ * The walls that close every gap a plan's walls leave, whatever opening each takes: a storey's
141
+ * outline for its roof, whether or not its doors and windows are in yet.
142
+ */
143
+ export function gapBridges(walls) {
144
+ return gapCandidates(walls).map(({ start, end, thickness }) => ({
145
+ start,
146
+ end,
147
+ thickness,
148
+ }));
149
+ }
150
+ const mid = (gap) => [
151
+ (gap.start[0] + gap.end[0]) / 2,
152
+ (gap.start[1] + gap.end[1]) / 2,
153
+ ];
154
+ const unitOf = (gap) => {
155
+ const [dx, dz] = sub(gap.end, gap.start);
156
+ const length = Math.hypot(dx, dz);
157
+ return [dx / length, dz / length];
158
+ };