@pascal-app/nodes 0.1.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +34 -0
  2. package/dist/building/definition.js +1 -1
  3. package/dist/cabinet/definition.d.ts.map +1 -1
  4. package/dist/cabinet/definition.js +809 -72
  5. package/dist/cabinet/geometry.d.ts.map +1 -1
  6. package/dist/cabinet/geometry.js +4 -0
  7. package/dist/cabinet/move-frame.js +3 -3
  8. package/dist/cabinet/panel.d.ts.map +1 -1
  9. package/dist/cabinet/panel.js +1 -0
  10. package/dist/cabinet/placement-snap.d.ts +8 -0
  11. package/dist/cabinet/placement-snap.d.ts.map +1 -0
  12. package/dist/cabinet/placement-snap.js +19 -0
  13. package/dist/cabinet/presets.js +8 -8
  14. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  15. package/dist/cabinet/quick-actions.js +9 -3
  16. package/dist/cabinet/resize-limits.d.ts +11 -0
  17. package/dist/cabinet/resize-limits.d.ts.map +1 -0
  18. package/dist/cabinet/resize-limits.js +22 -0
  19. package/dist/cabinet/run-layout.d.ts +8 -2
  20. package/dist/cabinet/run-layout.d.ts.map +1 -1
  21. package/dist/cabinet/run-layout.js +59 -7
  22. package/dist/cabinet/run-ops.d.ts +44 -3
  23. package/dist/cabinet/run-ops.d.ts.map +1 -1
  24. package/dist/cabinet/run-ops.js +646 -110
  25. package/dist/cabinet/run-panel.d.ts +2 -1
  26. package/dist/cabinet/run-panel.d.ts.map +1 -1
  27. package/dist/cabinet/run-panel.js +38 -4
  28. package/dist/cabinet/stack-transitions.js +4 -4
  29. package/dist/cabinet/tool.d.ts.map +1 -1
  30. package/dist/cabinet/tool.js +95 -17
  31. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  32. package/dist/cabinet/wall-snap.js +2 -6
  33. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  34. package/dist/ceiling/boundary-editor.js +2 -2
  35. package/dist/ceiling/definition.d.ts +1 -1
  36. package/dist/ceiling/definition.d.ts.map +1 -1
  37. package/dist/ceiling/definition.js +36 -5
  38. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  39. package/dist/ceiling/floorplan-move.d.ts +4 -4
  40. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  41. package/dist/ceiling/floorplan-move.js +5 -4
  42. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  43. package/dist/ceiling/hole-editor.js +2 -2
  44. package/dist/ceiling/move-tool.d.ts.map +1 -1
  45. package/dist/ceiling/move-tool.js +4 -3
  46. package/dist/ceiling/panel.d.ts.map +1 -1
  47. package/dist/ceiling/panel.js +65 -3
  48. package/dist/ceiling/renderer.d.ts.map +1 -1
  49. package/dist/ceiling/renderer.js +6 -2
  50. package/dist/ceiling/tool.d.ts.map +1 -1
  51. package/dist/ceiling/tool.js +12 -1
  52. package/dist/chimney/definition.d.ts.map +1 -1
  53. package/dist/chimney/definition.js +1 -0
  54. package/dist/chimney/tool.d.ts.map +1 -1
  55. package/dist/chimney/tool.js +16 -1
  56. package/dist/column/definition.d.ts.map +1 -1
  57. package/dist/column/definition.js +14 -2
  58. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  59. package/dist/column/floorplan-affordances.js +19 -14
  60. package/dist/column/floorplan-move.d.ts.map +1 -1
  61. package/dist/column/floorplan-move.js +7 -2
  62. package/dist/column/floorplan.d.ts +9 -1
  63. package/dist/column/floorplan.d.ts.map +1 -1
  64. package/dist/column/floorplan.js +59 -4
  65. package/dist/column/tool.d.ts.map +1 -1
  66. package/dist/column/tool.js +33 -7
  67. package/dist/construction-dimension/definition.d.ts +4 -0
  68. package/dist/construction-dimension/definition.d.ts.map +1 -0
  69. package/dist/construction-dimension/definition.js +83 -0
  70. package/dist/construction-dimension/drawing-coordination.d.ts +7 -0
  71. package/dist/construction-dimension/drawing-coordination.d.ts.map +1 -0
  72. package/dist/construction-dimension/drawing-coordination.js +54 -0
  73. package/dist/construction-dimension/floorplan-affordances.d.ts +4 -0
  74. package/dist/construction-dimension/floorplan-affordances.d.ts.map +1 -0
  75. package/dist/construction-dimension/floorplan-affordances.js +114 -0
  76. package/dist/construction-dimension/floorplan-tool.d.ts +21 -0
  77. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -0
  78. package/dist/construction-dimension/floorplan-tool.js +557 -0
  79. package/dist/construction-dimension/floorplan.d.ts +3 -0
  80. package/dist/construction-dimension/floorplan.d.ts.map +1 -0
  81. package/dist/construction-dimension/floorplan.js +457 -0
  82. package/dist/construction-dimension/geometry.d.ts +31 -0
  83. package/dist/construction-dimension/geometry.d.ts.map +1 -0
  84. package/dist/construction-dimension/geometry.js +144 -0
  85. package/dist/construction-dimension/index.d.ts +4 -0
  86. package/dist/construction-dimension/index.d.ts.map +1 -0
  87. package/dist/construction-dimension/index.js +3 -0
  88. package/dist/construction-dimension/panel.d.ts +2 -0
  89. package/dist/construction-dimension/panel.d.ts.map +1 -0
  90. package/dist/construction-dimension/panel.js +128 -0
  91. package/dist/construction-dimension/parametrics.d.ts +3 -0
  92. package/dist/construction-dimension/parametrics.d.ts.map +1 -0
  93. package/dist/construction-dimension/parametrics.js +4 -0
  94. package/dist/construction-dimension/schema.d.ts +2 -0
  95. package/dist/construction-dimension/schema.d.ts.map +1 -0
  96. package/dist/construction-dimension/schema.js +1 -0
  97. package/dist/door/contextual-dimensions.d.ts +3 -0
  98. package/dist/door/contextual-dimensions.d.ts.map +1 -0
  99. package/dist/door/contextual-dimensions.js +7 -0
  100. package/dist/door/definition.d.ts.map +1 -1
  101. package/dist/door/definition.js +13 -8
  102. package/dist/door/floorplan-affordances.d.ts +2 -5
  103. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  104. package/dist/door/floorplan-affordances.js +9 -18
  105. package/dist/door/floorplan.d.ts +3 -4
  106. package/dist/door/floorplan.d.ts.map +1 -1
  107. package/dist/door/floorplan.js +88 -6
  108. package/dist/door/move-tool.d.ts.map +1 -1
  109. package/dist/door/move-tool.js +2 -2
  110. package/dist/door/panel.d.ts.map +1 -1
  111. package/dist/door/panel.js +3 -1
  112. package/dist/door/schema.d.ts +1 -1
  113. package/dist/door/schema.d.ts.map +1 -1
  114. package/dist/door/schema.js +1 -1
  115. package/dist/door/tool.d.ts.map +1 -1
  116. package/dist/door/tool.js +63 -6
  117. package/dist/dormer/definition.d.ts.map +1 -1
  118. package/dist/dormer/definition.js +1 -0
  119. package/dist/dormer/tool.d.ts.map +1 -1
  120. package/dist/dormer/tool.js +23 -1
  121. package/dist/duct-segment/tool.d.ts.map +1 -1
  122. package/dist/duct-segment/tool.js +20 -9
  123. package/dist/duct-terminal/tool.d.ts.map +1 -1
  124. package/dist/duct-terminal/tool.js +9 -6
  125. package/dist/elevator/floorplan-affordances.d.ts +2 -6
  126. package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
  127. package/dist/elevator/floorplan-affordances.js +13 -12
  128. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  129. package/dist/fence/actions/move-endpoint.js +29 -1
  130. package/dist/fence/definition.d.ts.map +1 -1
  131. package/dist/fence/definition.js +67 -14
  132. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  133. package/dist/fence/floorplan-affordances.js +48 -11
  134. package/dist/fence/floorplan-move.d.ts.map +1 -1
  135. package/dist/fence/floorplan-move.js +38 -3
  136. package/dist/fence/geometry.d.ts.map +1 -1
  137. package/dist/fence/geometry.js +9 -1
  138. package/dist/fence/lift.d.ts +15 -0
  139. package/dist/fence/lift.d.ts.map +1 -0
  140. package/dist/fence/lift.js +23 -0
  141. package/dist/fence/move-tool.d.ts.map +1 -1
  142. package/dist/fence/move-tool.js +25 -5
  143. package/dist/fence/system.d.ts +3 -0
  144. package/dist/fence/system.d.ts.map +1 -0
  145. package/dist/fence/system.js +41 -0
  146. package/dist/fence/tool.d.ts.map +1 -1
  147. package/dist/fence/tool.js +103 -32
  148. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  149. package/dist/hvac-equipment/tool.js +8 -3
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +6 -0
  153. package/dist/item/definition.d.ts.map +1 -1
  154. package/dist/item/definition.js +7 -1
  155. package/dist/item/floorplan-move.d.ts.map +1 -1
  156. package/dist/item/floorplan-move.js +50 -43
  157. package/dist/item/floorplan.d.ts +1 -0
  158. package/dist/item/floorplan.d.ts.map +1 -1
  159. package/dist/item/floorplan.js +49 -0
  160. package/dist/item/renderer.d.ts +3 -0
  161. package/dist/item/renderer.d.ts.map +1 -1
  162. package/dist/item/renderer.js +96 -8
  163. package/dist/level/definition.d.ts.map +1 -1
  164. package/dist/level/definition.js +7 -3
  165. package/dist/lineset/tool.d.ts.map +1 -1
  166. package/dist/lineset/tool.js +5 -1
  167. package/dist/liquid-line/tool.d.ts.map +1 -1
  168. package/dist/liquid-line/tool.js +7 -1
  169. package/dist/measurement/definition.d.ts.map +1 -1
  170. package/dist/measurement/definition.js +5 -0
  171. package/dist/measurement/floorplan.d.ts.map +1 -1
  172. package/dist/measurement/floorplan.js +11 -10
  173. package/dist/measurement/index.d.ts +1 -1
  174. package/dist/measurement/index.d.ts.map +1 -1
  175. package/dist/measurement/index.js +1 -1
  176. package/dist/measurement/resolve.d.ts +5 -0
  177. package/dist/measurement/resolve.d.ts.map +1 -1
  178. package/dist/measurement/resolve.js +2 -2
  179. package/dist/measurement/surface-query.js +5 -5
  180. package/dist/measurement/tool.d.ts +6 -1
  181. package/dist/measurement/tool.d.ts.map +1 -1
  182. package/dist/measurement/tool.js +7 -11
  183. package/dist/pipe-segment/tool.d.ts.map +1 -1
  184. package/dist/pipe-segment/tool.js +22 -19
  185. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  186. package/dist/roof-segment/floorplan-affordances.js +14 -8
  187. package/dist/shared/construction-dimension-standards.d.ts +34 -0
  188. package/dist/shared/construction-dimension-standards.d.ts.map +1 -0
  189. package/dist/shared/construction-dimension-standards.js +18 -0
  190. package/dist/shared/construction-length.d.ts +10 -0
  191. package/dist/shared/construction-length.d.ts.map +1 -0
  192. package/dist/shared/construction-length.js +57 -0
  193. package/dist/shared/dimension-string.d.ts +20 -0
  194. package/dist/shared/dimension-string.d.ts.map +1 -0
  195. package/dist/shared/dimension-string.js +19 -0
  196. package/dist/shared/draft-axis-guides.d.ts +36 -0
  197. package/dist/shared/draft-axis-guides.d.ts.map +1 -0
  198. package/dist/shared/draft-axis-guides.js +107 -0
  199. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  200. package/dist/shared/move-roof-tool.js +17 -3
  201. package/dist/shared/opening-documentation-fields.d.ts +16 -0
  202. package/dist/shared/opening-documentation-fields.d.ts.map +1 -0
  203. package/dist/shared/opening-documentation-fields.js +54 -0
  204. package/dist/shared/opening-documentation.d.ts +47 -0
  205. package/dist/shared/opening-documentation.d.ts.map +1 -0
  206. package/dist/shared/opening-documentation.js +300 -0
  207. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  208. package/dist/shared/opening-guides-runtime.js +3 -2
  209. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  210. package/dist/shared/opening-placement-dimensions.js +14 -5
  211. package/dist/shared/wall-opening-ceiling.d.ts +30 -0
  212. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -0
  213. package/dist/shared/wall-opening-ceiling.js +29 -0
  214. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  215. package/dist/shelf/floorplan-affordances.js +10 -5
  216. package/dist/shelf/floorplan-move.d.ts +2 -16
  217. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  218. package/dist/shelf/floorplan-move.js +19 -40
  219. package/dist/shelf/tool.d.ts.map +1 -1
  220. package/dist/shelf/tool.js +8 -3
  221. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  222. package/dist/site/recessed-slab-ground-holes.js +1 -4
  223. package/dist/site/renderer.d.ts.map +1 -1
  224. package/dist/site/renderer.js +118 -28
  225. package/dist/site/terrain-drape.d.ts +91 -0
  226. package/dist/site/terrain-drape.d.ts.map +1 -0
  227. package/dist/site/terrain-drape.js +205 -0
  228. package/dist/site/terrain-geometry.d.ts +131 -0
  229. package/dist/site/terrain-geometry.d.ts.map +1 -0
  230. package/dist/site/terrain-geometry.js +259 -0
  231. package/dist/site/terrain-mesh.d.ts +49 -0
  232. package/dist/site/terrain-mesh.d.ts.map +1 -0
  233. package/dist/site/terrain-mesh.js +122 -0
  234. package/dist/site/terrain-renderer.d.ts +28 -0
  235. package/dist/site/terrain-renderer.d.ts.map +1 -0
  236. package/dist/site/terrain-renderer.js +69 -0
  237. package/dist/skylight/definition.d.ts.map +1 -1
  238. package/dist/skylight/definition.js +1 -0
  239. package/dist/skylight/tool.d.ts.map +1 -1
  240. package/dist/skylight/tool.js +16 -1
  241. package/dist/slab/definition.d.ts.map +1 -1
  242. package/dist/slab/definition.js +87 -10
  243. package/dist/slab/elevation-limit.d.ts +43 -0
  244. package/dist/slab/elevation-limit.d.ts.map +1 -0
  245. package/dist/slab/elevation-limit.js +124 -0
  246. package/dist/slab/floorplan-affordances.d.ts +16 -0
  247. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  248. package/dist/slab/geometry.d.ts.map +1 -1
  249. package/dist/slab/geometry.js +98 -5
  250. package/dist/slab/panel.d.ts.map +1 -1
  251. package/dist/slab/panel.js +82 -4
  252. package/dist/slab/parametrics.d.ts +1 -1
  253. package/dist/slab/parametrics.d.ts.map +1 -1
  254. package/dist/slab/parametrics.js +13 -1
  255. package/dist/slab/placement-ownership.d.ts +3 -0
  256. package/dist/slab/placement-ownership.d.ts.map +1 -0
  257. package/dist/slab/placement-ownership.js +3 -0
  258. package/dist/slab/quick-measurement.d.ts.map +1 -1
  259. package/dist/slab/quick-measurement.js +3 -2
  260. package/dist/slab/system.d.ts.map +1 -1
  261. package/dist/slab/system.js +14 -4
  262. package/dist/slab/tool.d.ts.map +1 -1
  263. package/dist/slab/tool.js +81 -23
  264. package/dist/solar-panel/definition.d.ts.map +1 -1
  265. package/dist/solar-panel/definition.js +1 -0
  266. package/dist/solar-panel/tool.d.ts.map +1 -1
  267. package/dist/solar-panel/tool.js +17 -1
  268. package/dist/spawn/definition.d.ts.map +1 -1
  269. package/dist/spawn/definition.js +1 -0
  270. package/dist/spawn/floorplan-affordances.d.ts.map +1 -1
  271. package/dist/spawn/floorplan-affordances.js +7 -4
  272. package/dist/spawn/floorplan-move.d.ts.map +1 -1
  273. package/dist/spawn/floorplan-move.js +8 -6
  274. package/dist/spawn/renderer.d.ts +4 -0
  275. package/dist/spawn/renderer.d.ts.map +1 -1
  276. package/dist/spawn/renderer.js +32 -18
  277. package/dist/spawn/tool.d.ts +2 -2
  278. package/dist/spawn/tool.d.ts.map +1 -1
  279. package/dist/spawn/tool.js +78 -11
  280. package/dist/stair/definition.d.ts.map +1 -1
  281. package/dist/stair/definition.js +15 -7
  282. package/dist/stair/destination.d.ts +16 -0
  283. package/dist/stair/destination.d.ts.map +1 -0
  284. package/dist/stair/destination.js +24 -0
  285. package/dist/stair/documentation.d.ts +8 -0
  286. package/dist/stair/documentation.d.ts.map +1 -0
  287. package/dist/stair/documentation.js +245 -0
  288. package/dist/stair/floor-stack.d.ts.map +1 -1
  289. package/dist/stair/floor-stack.js +38 -0
  290. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  291. package/dist/stair/floorplan-affordances.js +28 -9
  292. package/dist/stair/floorplan-move.d.ts +3 -5
  293. package/dist/stair/floorplan-move.d.ts.map +1 -1
  294. package/dist/stair/floorplan-move.js +14 -16
  295. package/dist/stair/floorplan.d.ts.map +1 -1
  296. package/dist/stair/floorplan.js +27 -14
  297. package/dist/stair/panel.d.ts.map +1 -1
  298. package/dist/stair/panel.js +35 -2
  299. package/dist/stair/renderer.d.ts.map +1 -1
  300. package/dist/stair/renderer.js +4 -3
  301. package/dist/structural-grid/coordination.d.ts +16 -0
  302. package/dist/structural-grid/coordination.d.ts.map +1 -0
  303. package/dist/structural-grid/coordination.js +105 -0
  304. package/dist/structural-grid/definition.d.ts +4 -0
  305. package/dist/structural-grid/definition.d.ts.map +1 -0
  306. package/dist/structural-grid/definition.js +51 -0
  307. package/dist/structural-grid/floorplan-tool.d.ts +16 -0
  308. package/dist/structural-grid/floorplan-tool.d.ts.map +1 -0
  309. package/dist/structural-grid/floorplan-tool.js +183 -0
  310. package/dist/structural-grid/floorplan.d.ts +3 -0
  311. package/dist/structural-grid/floorplan.d.ts.map +1 -0
  312. package/dist/structural-grid/floorplan.js +61 -0
  313. package/dist/structural-grid/index.d.ts +2 -0
  314. package/dist/structural-grid/index.d.ts.map +1 -0
  315. package/dist/structural-grid/index.js +1 -0
  316. package/dist/structural-grid/schema.d.ts +2 -0
  317. package/dist/structural-grid/schema.d.ts.map +1 -0
  318. package/dist/structural-grid/schema.js +1 -0
  319. package/dist/wall/construction-dimensions.d.ts +32 -0
  320. package/dist/wall/construction-dimensions.d.ts.map +1 -0
  321. package/dist/wall/construction-dimensions.js +1031 -0
  322. package/dist/wall/contextual-dimensions.d.ts +13 -0
  323. package/dist/wall/contextual-dimensions.d.ts.map +1 -0
  324. package/dist/wall/contextual-dimensions.js +221 -0
  325. package/dist/wall/definition.d.ts.map +1 -1
  326. package/dist/wall/definition.js +20 -1
  327. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  328. package/dist/wall/floorplan-affordances.js +23 -8
  329. package/dist/wall/floorplan-overrides.d.ts +9 -6
  330. package/dist/wall/floorplan-overrides.d.ts.map +1 -1
  331. package/dist/wall/floorplan-overrides.js +20 -11
  332. package/dist/wall/floorplan.d.ts +12 -3
  333. package/dist/wall/floorplan.d.ts.map +1 -1
  334. package/dist/wall/floorplan.js +121 -79
  335. package/dist/wall/measurement.d.ts.map +1 -1
  336. package/dist/wall/measurement.js +17 -4
  337. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  338. package/dist/wall/move-endpoint-tool.js +74 -27
  339. package/dist/wall/move-shared.d.ts.map +1 -1
  340. package/dist/wall/move-shared.js +3 -2
  341. package/dist/wall/move-tool.d.ts.map +1 -1
  342. package/dist/wall/move-tool.js +15 -3
  343. package/dist/wall/paint.d.ts.map +1 -1
  344. package/dist/wall/paint.js +10 -6
  345. package/dist/wall/panel.d.ts.map +1 -1
  346. package/dist/wall/panel.js +32 -5
  347. package/dist/wall/parametrics.d.ts.map +1 -1
  348. package/dist/wall/parametrics.js +2 -0
  349. package/dist/wall/preview.d.ts +8 -0
  350. package/dist/wall/preview.d.ts.map +1 -0
  351. package/dist/wall/preview.js +39 -0
  352. package/dist/wall/quick-measurement.d.ts.map +1 -1
  353. package/dist/wall/quick-measurement.js +3 -2
  354. package/dist/wall/renderer.d.ts.map +1 -1
  355. package/dist/wall/renderer.js +7 -5
  356. package/dist/wall/system.d.ts +1 -1
  357. package/dist/wall/system.d.ts.map +1 -1
  358. package/dist/wall/system.js +37 -2
  359. package/dist/wall/tool.d.ts.map +1 -1
  360. package/dist/wall/tool.js +148 -96
  361. package/dist/wall/treatment-level-data.d.ts +14 -0
  362. package/dist/wall/treatment-level-data.d.ts.map +1 -0
  363. package/dist/wall/treatment-level-data.js +31 -0
  364. package/dist/wall/treatments.d.ts +8 -2
  365. package/dist/wall/treatments.d.ts.map +1 -1
  366. package/dist/wall/treatments.js +58 -15
  367. package/dist/window/contextual-dimensions.d.ts +3 -0
  368. package/dist/window/contextual-dimensions.d.ts.map +1 -0
  369. package/dist/window/contextual-dimensions.js +7 -0
  370. package/dist/window/definition.d.ts.map +1 -1
  371. package/dist/window/definition.js +15 -10
  372. package/dist/window/floorplan-affordances.d.ts +2 -5
  373. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  374. package/dist/window/floorplan-affordances.js +9 -15
  375. package/dist/window/floorplan-move.d.ts.map +1 -1
  376. package/dist/window/floorplan-move.js +1 -1
  377. package/dist/window/floorplan.d.ts.map +1 -1
  378. package/dist/window/floorplan.js +7 -1
  379. package/dist/window/move-tool.d.ts.map +1 -1
  380. package/dist/window/move-tool.js +3 -3
  381. package/dist/window/panel.d.ts.map +1 -1
  382. package/dist/window/panel.js +4 -1
  383. package/dist/window/schema.d.ts +1 -1
  384. package/dist/window/schema.d.ts.map +1 -1
  385. package/dist/window/schema.js +1 -1
  386. package/dist/window/tool.d.ts.map +1 -1
  387. package/dist/window/tool.js +64 -7
  388. package/dist/window/window-math.d.ts +7 -3
  389. package/dist/window/window-math.d.ts.map +1 -1
  390. package/dist/window/window-math.js +8 -3
  391. package/dist/zone/contextual-dimensions.d.ts +3 -0
  392. package/dist/zone/contextual-dimensions.d.ts.map +1 -0
  393. package/dist/zone/contextual-dimensions.js +43 -0
  394. package/dist/zone/definition.d.ts.map +1 -1
  395. package/dist/zone/definition.js +9 -1
  396. package/dist/zone/floorplan-affordances.d.ts +36 -0
  397. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  398. package/dist/zone/floorplan.d.ts.map +1 -1
  399. package/dist/zone/floorplan.js +59 -3
  400. package/dist/zone/quantities-panel.d.ts.map +1 -1
  401. package/dist/zone/quantities-panel.js +48 -4
  402. package/dist/zone/room-clear-dimensions.d.ts +3 -0
  403. package/dist/zone/room-clear-dimensions.d.ts.map +1 -0
  404. package/dist/zone/room-clear-dimensions.js +406 -0
  405. package/dist/zone/room-documentation.d.ts +11 -0
  406. package/dist/zone/room-documentation.d.ts.map +1 -0
  407. package/dist/zone/room-documentation.js +97 -0
  408. package/package.json +7 -7
@@ -1,6 +1,7 @@
1
1
  import { getEffectiveWallSurfaceMaterial, getWallBandSlotId, getWallFaceBandConfig, getWallFaceBandForHeight, getWallSurfaceSideFromBandSlot, parseMaterialRef, sceneRegistry, useScene, WALL_SURFACE_SLOT_DEFAULTS, } from '@pascal-app/core';
2
2
  import { Raycaster } from 'three';
3
3
  import { buildSlotPreviewMaterial, createSlotPaintCapability, previewSlotByUserData, } from '../shared/slot-paint';
4
+ import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
4
5
  const WALL_SLOT_IDS = new Set(Object.keys(WALL_SURFACE_SLOT_DEFAULTS));
5
6
  const WALL_ARRAY_SLOT_INDEX = {
6
7
  interior: 1,
@@ -68,10 +69,11 @@ export function resolveWallRole(args) {
68
69
  return indexedSlotId;
69
70
  }
70
71
  if (sideFromIndex && localPosition) {
71
- const bands = getWallFaceBandConfig(node);
72
+ const effectiveWallHeight = resolveWallOpeningCeiling(node, useScene.getState().nodes);
73
+ const bands = getWallFaceBandConfig(node, effectiveWallHeight);
72
74
  if (!bands.enabled)
73
75
  return sideFromIndex;
74
- return getWallBandSlotId(sideFromIndex, getWallFaceBandForHeight(node, localPosition[1]));
76
+ return getWallBandSlotId(sideFromIndex, getWallFaceBandForHeight(node, localPosition[1], effectiveWallHeight));
75
77
  }
76
78
  if (sideFromIndex)
77
79
  return sideFromIndex;
@@ -88,16 +90,18 @@ export function resolveWallRole(args) {
88
90
  const hitFace = localZ >= 0 ? 'front' : 'back';
89
91
  const semantic = hitFace === 'front' ? node.frontSide : node.backSide;
90
92
  if (semantic === 'interior' || semantic === 'exterior') {
91
- const bands = getWallFaceBandConfig(node);
93
+ const effectiveWallHeight = resolveWallOpeningCeiling(node, useScene.getState().nodes);
94
+ const bands = getWallFaceBandConfig(node, effectiveWallHeight);
92
95
  if (!bands.enabled)
93
96
  return semantic;
94
- return getWallBandSlotId(semantic, getWallFaceBandForHeight(node, localPosition[1]));
97
+ return getWallBandSlotId(semantic, getWallFaceBandForHeight(node, localPosition[1], effectiveWallHeight));
95
98
  }
96
99
  const side = hitFace === 'front' ? 'interior' : 'exterior';
97
- const bands = getWallFaceBandConfig(node);
100
+ const effectiveWallHeight = resolveWallOpeningCeiling(node, useScene.getState().nodes);
101
+ const bands = getWallFaceBandConfig(node, effectiveWallHeight);
98
102
  if (!bands.enabled)
99
103
  return side;
100
- return getWallBandSlotId(side, getWallFaceBandForHeight(node, localPosition[1]));
104
+ return getWallBandSlotId(side, getWallFaceBandForHeight(node, localPosition[1], effectiveWallHeight));
101
105
  }
102
106
  /**
103
107
  * Preview a wall paint by swapping just the painted face's entry in the wall
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"AAmEA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA8OhC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/wall/panel.tsx"],"names":[],"mappings":"AAoEA,MAAM,CAAC,OAAO,UAAU,SAAS,uCAwRhC"}
@@ -5,6 +5,7 @@ import { ActionButton, ActionGroup, curveReshapeScope, getLinearUnitLabel, linea
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Spline } from 'lucide-react';
7
7
  import { useCallback, useMemo, useRef } from 'react';
8
+ import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
8
9
  const WALL_TRIM_PROFILE_OPTIONS = {
9
10
  skirting: [
10
11
  { label: 'Flat', value: 'flat' },
@@ -63,6 +64,15 @@ export default function WallPanel() {
63
64
  return false;
64
65
  });
65
66
  });
67
+ // Existing plane-bound walls have no stored height. Resolve their current
68
+ // body height for display and materialize it if the user edits height or
69
+ // enables terrain infill.
70
+ const resolvedHeightMeters = useScene((s) => {
71
+ const wall = selectedId ? s.nodes[selectedId] : undefined;
72
+ if (wall?.type !== 'wall')
73
+ return undefined;
74
+ return resolveWallOpeningCeiling(wall, s.nodes);
75
+ });
66
76
  // Mirror the latest node into a ref so the slider handlers below have
67
77
  // stable identities across re-renders. Without this, every store tick
68
78
  // (one per pointermove during a slider drag) rebuilt the handler
@@ -93,6 +103,16 @@ export default function WallPanel() {
93
103
  ];
94
104
  handleUpdate({ end: newEnd });
95
105
  }, [handleUpdate]);
106
+ const handleBaseModeChange = useCallback((mode) => {
107
+ const n = nodeRef.current;
108
+ if (!n)
109
+ return;
110
+ const height = n.height ?? resolveWallOpeningCeiling(n, useScene.getState().nodes);
111
+ handleUpdate({
112
+ height: Math.max(0.1, height),
113
+ fillToTerrain: mode === 'terrain' ? true : undefined,
114
+ });
115
+ }, [handleUpdate]);
96
116
  const handleClose = useCallback(() => {
97
117
  setSelection({ selectedIds: [] });
98
118
  }, [setSelection]);
@@ -106,7 +126,8 @@ export default function WallPanel() {
106
126
  if (!(node && node.type === 'wall' && selectedId))
107
127
  return null;
108
128
  const length = getWallCurveLength(node);
109
- const height = node.height ?? 2.5;
129
+ const followsTerrain = node.fillToTerrain === true;
130
+ const height = node.height ?? resolvedHeightMeters ?? 2.5;
110
131
  const thickness = node.thickness ?? 0.1;
111
132
  const curveOffset = getClampedWallCurveOffset(node);
112
133
  const maxCurveOffset = getMaxWallCurveOffset(node);
@@ -117,14 +138,20 @@ export default function WallPanel() {
117
138
  const displayCurveOffset = metersToLinearUnit(curveOffset, unit);
118
139
  const displayMaxCurveOffset = metersToLinearUnit(maxCurveOffset, unit);
119
140
  const curveOffsetLimit = Math.max(0.01, maxCurveOffset);
120
- const wallHeightMeters = node.height ?? 2.5;
141
+ const wallHeightMeters = height;
121
142
  const skirting = { ...WALL_SKIRTING_DEFAULT, ...(node.skirting ?? {}) };
122
143
  const crown = { ...WALL_CROWN_DEFAULT, ...(node.crown ?? {}) };
123
144
  const chairRail = { ...WALL_CHAIR_RAIL_DEFAULT, ...(node.chairRail ?? {}) };
124
145
  return (_jsxs(PanelWrapper, { icon: "/icons/wall.webp", onClose: handleClose, title: node.name || 'Wall', width: 280, children: [_jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Length", max: metersToLinearUnit(20, unit), min: metersToLinearUnit(0.1, unit), onChange: (value) => handleUpdateLength(linearControlValueToMeters(value, unit, { maxMeters: 20, minMeters: 0.1 })), precision: 2, step: unit === 'imperial' ? 0.1 : 0.01, unit: unitLabel, value: displayLength }), _jsx(SliderControl, { label: "Height", max: metersToLinearUnit(6, unit), min: metersToLinearUnit(0.1, unit), onChange: (v) => handleUpdate({
125
146
  height: linearControlValueToMeters(v, unit, { maxMeters: 6, minMeters: 0.1 }),
126
- }), precision: 2, step: 0.1, unit: unitLabel, value: Math.round(displayHeight * 100) / 100 }), _jsx(SliderControl, { label: "Thickness", max: metersToLinearUnit(1, unit), min: metersToLinearUnit(0.05, unit), onChange: (v) => handleUpdate({
127
- thickness: linearControlValueToMeters(v, unit, { maxMeters: 1, minMeters: 0.05 }),
147
+ }), precision: 2, step: 0.1, unit: unitLabel, value: Math.round(displayHeight * 100) / 100 }), _jsx("div", { className: "px-1 font-medium text-[10px] text-muted-foreground/80 uppercase tracking-wider", children: "Base" }), _jsx(SegmentedControl, { onChange: handleBaseModeChange, options: [
148
+ { label: 'Fixed', value: 'fixed' },
149
+ { label: 'Follows level', value: 'terrain' },
150
+ ], value: followsTerrain ? 'terrain' : 'fixed' }), followsTerrain && (_jsx("div", { className: "px-1 text-[11px] text-muted-foreground", children: "Extends downward to meet the terrain. Height and top stay unchanged." })), _jsx(SliderControl, { label: "Thickness", max: metersToLinearUnit(1, unit), min: metersToLinearUnit(0.05, unit), onChange: (v) => handleUpdate({
151
+ thickness: linearControlValueToMeters(v, unit, {
152
+ maxMeters: 1,
153
+ minMeters: 0.05,
154
+ }),
128
155
  }), precision: 3, step: 0.01, unit: unitLabel, value: Math.round(displayThickness * 1000) / 1000 }), !hasWallChildrenBlockingCurve && (_jsx(SliderControl, { label: "Curve", max: Math.max(metersToLinearUnit(0.01, unit), displayMaxCurveOffset), min: -Math.max(metersToLinearUnit(0.01, unit), displayMaxCurveOffset), onChange: (v) => handleUpdate({
129
156
  curveOffset: normalizeWallCurveOffset(node, linearControlValueToMeters(v, unit, {
130
157
  maxMeters: curveOffsetLimit,
@@ -133,7 +160,7 @@ export default function WallPanel() {
133
160
  }), precision: 2, step: 0.1, unit: unitLabel, value: Math.round(displayCurveOffset * 100) / 100 }))] }), _jsx(WallFaceBandSection, { node: node, onUpdate: handleUpdate, unit: unit, unitLabel: unitLabel, wallHeightMeters: wallHeightMeters }), _jsx(WallTrimSection, { node: node, onUpdate: handleUpdate, title: "Skirting", trimKey: "skirting", trimValue: skirting, unit: unit, unitLabel: unitLabel, wallHeightMeters: wallHeightMeters }), _jsx(WallTrimSection, { node: node, onUpdate: handleUpdate, title: "Crown molding", trimKey: "crown", trimValue: crown, unit: unit, unitLabel: unitLabel, wallHeightMeters: wallHeightMeters }), _jsx(WallTrimSection, { node: node, onUpdate: handleUpdate, title: "Chair rail", trimKey: "chairRail", trimValue: chairRail, unit: unit, unitLabel: unitLabel, wallHeightMeters: wallHeightMeters }), !hasWallChildrenBlockingCurve && (_jsx(PanelSection, { title: "Actions", children: _jsx(ActionGroup, { children: _jsx(ActionButton, { icon: _jsx(Spline, { className: "h-3.5 w-3.5" }), label: "Curve", onClick: handleCurve }) }) }))] }));
134
161
  }
135
162
  function WallFaceBandSection({ node, onUpdate, unit, unitLabel, wallHeightMeters, }) {
136
- const bandConfig = getWallFaceBandConfig(node);
163
+ const bandConfig = getWallFaceBandConfig(node, wallHeightMeters);
137
164
  const bandCount = bandConfig.count;
138
165
  const lowerHeight = bandConfig.lowerHeight;
139
166
  const middleHeight = bandConfig.middleHeight;
@@ -1 +1 @@
1
- {"version":3,"file":"parametrics.d.ts","sourceRoot":"","sources":["../../src/wall/parametrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAiB1D,CAAA"}
1
+ {"version":3,"file":"parametrics.d.ts","sourceRoot":"","sources":["../../src/wall/parametrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAmB1D,CAAA"}
@@ -16,6 +16,8 @@ export const wallParametrics = {
16
16
  label: 'Dimensions',
17
17
  fields: [
18
18
  { key: 'thickness', kind: 'number', unit: 'm', min: 0.05, max: 0.6, step: 0.01 },
19
+ // `height` may be absent (plane-bound top); the custom panel owns the
20
+ // Follows storey / Custom height mode switch, so this is metadata only.
19
21
  { key: 'height', kind: 'number', unit: 'm', min: 1.5, max: 6, step: 0.05 },
20
22
  { key: 'curveOffset', kind: 'number', unit: 'm', min: -3, max: 3, step: 0.05 },
21
23
  ],
@@ -0,0 +1,8 @@
1
+ import { type WallNode } from '@pascal-app/core';
2
+ import { ExtrudeGeometry } from 'three';
3
+ export declare function buildWallPreviewGeometry(node: Pick<WallNode, 'start' | 'end' | 'curveOffset' | 'height' | 'thickness'>): ExtrudeGeometry;
4
+ declare const WallPreview: ({ node }: {
5
+ node: WallNode;
6
+ }) => import("react").JSX.Element;
7
+ export default WallPreview;
8
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/wall/preview.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGvE,OAAO,EAAE,eAAe,EAAS,MAAM,OAAO,CAAA;AAK9C,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,GAAG,WAAW,CAAC,mBAsB/E;AAED,QAAA,MAAM,WAAW,GAAI,UAAU;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAoBhD,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -0,0 +1,39 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { getWallSurfacePolygon } from '@pascal-app/core';
4
+ import { EDITOR_LAYER } from '@pascal-app/editor';
5
+ import { useEffect, useMemo } from 'react';
6
+ import { ExtrudeGeometry, Shape } from 'three';
7
+ const WALL_PREVIEW_HEIGHT = 2.5;
8
+ const WALL_PREVIEW_THICKNESS = 0.1;
9
+ export function buildWallPreviewGeometry(node) {
10
+ const polygon = getWallSurfacePolygon({
11
+ start: node.start,
12
+ end: node.end,
13
+ curveOffset: node.curveOffset,
14
+ thickness: node.thickness ?? WALL_PREVIEW_THICKNESS,
15
+ });
16
+ const shape = new Shape();
17
+ polygon.forEach((point, index) => {
18
+ if (index === 0)
19
+ shape.moveTo(point.x, -point.y);
20
+ else
21
+ shape.lineTo(point.x, -point.y);
22
+ });
23
+ shape.closePath();
24
+ const geometry = new ExtrudeGeometry(shape, {
25
+ bevelEnabled: false,
26
+ depth: node.height ?? WALL_PREVIEW_HEIGHT,
27
+ steps: 1,
28
+ });
29
+ geometry.rotateX(-Math.PI / 2);
30
+ geometry.computeBoundingBox();
31
+ return geometry;
32
+ }
33
+ const WallPreview = ({ node }) => {
34
+ const { curveOffset, end, height, start, thickness } = node;
35
+ const geometry = useMemo(() => buildWallPreviewGeometry({ curveOffset, end, height, start, thickness }), [curveOffset, end, height, start, thickness]);
36
+ useEffect(() => () => geometry.dispose(), [geometry]);
37
+ return (_jsx("mesh", { geometry: geometry, layers: EDITOR_LAYER, raycast: () => undefined, renderOrder: 1, children: _jsx("meshBasicMaterial", { color: "#818cf8", depthTest: false, depthWrite: false, opacity: 0.5, transparent: true }) }));
38
+ };
39
+ export default WallPreview;
@@ -1 +1 @@
1
- {"version":3,"file":"quick-measurement.d.ts","sourceRoot":"","sources":["../../src/wall/quick-measurement.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAEzB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,sBAAsB,CA6B3E"}
1
+ {"version":3,"file":"quick-measurement.d.ts","sourceRoot":"","sources":["../../src/wall/quick-measurement.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,sBAAsB,EAE3B,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,sBAAsB,CA6B3E"}
@@ -1,7 +1,8 @@
1
- import { DEFAULT_WALL_HEIGHT, getWallCurveFrameAt, getWallCurveLength, getWallThickness, } from '@pascal-app/core';
1
+ import { getWallCurveFrameAt, getWallCurveLength, getWallThickness, useScene, } from '@pascal-app/core';
2
+ import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
2
3
  export function wallQuickMeasurement(node) {
3
4
  const length = getWallCurveLength(node);
4
- const height = node.height ?? DEFAULT_WALL_HEIGHT;
5
+ const height = resolveWallOpeningCeiling(node, useScene.getState().nodes);
5
6
  const frame = getWallCurveFrameAt(node, 0.5);
6
7
  return {
7
8
  title: node.name ?? 'Wall',
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/wall/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAOzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,QAAA,MAAM,YAAY,GAAI,UAAU;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAgFjD,CAAA;AAED,eAAe,YAAY,CAAA"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/wall/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AASzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,QAAA,MAAM,YAAY,GAAI,UAAU;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAyFjD,CAAA;AAED,eAAe,YAAY,CAAA"}
@@ -3,7 +3,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useRegistry, useScene, } from '@pascal-app/core';
4
4
  import { getVisibleWallMaterials, NodeRenderer, useNodeEvents, useViewer } from '@pascal-app/viewer';
5
5
  import { useEffect, useLayoutEffect, useMemo, useRef } from 'react';
6
+ import { useShallow } from 'zustand/react/shallow';
6
7
  import { createPlaceholderGeometry } from '../shared/placeholder-geometry';
8
+ import { useWallTreatmentLevelData } from './treatment-level-data';
7
9
  import { createWallExtraSlotMaterials, WallTreatments } from './treatments';
8
10
  /**
9
11
  * Thin wall renderer.
@@ -43,10 +45,10 @@ const WallRenderer = ({ node }) => {
43
45
  const textures = useViewer((s) => s.textures);
44
46
  const colorPreset = useViewer((s) => s.colorPreset);
45
47
  const sceneTheme = useViewer((s) => s.sceneTheme);
46
- const sceneNodes = useScene((state) => state.nodes);
47
- const childNodes = useMemo(() => (node.children ?? [])
48
- .map((childId) => sceneNodes[childId])
49
- .filter((child) => child !== undefined), [node.children, sceneNodes]);
48
+ const childNodes = useScene(useShallow((state) => (node.children ?? [])
49
+ .map((childId) => state.nodes[childId])
50
+ .filter((child) => child !== undefined)));
51
+ const treatmentLevelData = useWallTreatmentLevelData((state) => node.parentId ? state.byLevelId.get(node.parentId) : undefined);
50
52
  // Subscribe to the scene-material palette so editing a `scene:` material a
51
53
  // wall slot references re-renders the wall live (the wall-system geometry
52
54
  // dirty loop never fires for a material-only edit). `getMaterialsForWall`'s
@@ -60,6 +62,6 @@ const WallRenderer = ({ node }) => {
60
62
  for (const entry of owned)
61
63
  entry.dispose();
62
64
  }, [baseMaterials, extraMaterials]);
63
- return (_jsxs("mesh", { castShadow: true, geometry: placeholderGeometry, material: baseMaterials, receiveShadow: true, ref: ref, visible: node.visible, children: [_jsx("mesh", { geometry: collisionPlaceholderGeometry, name: "collision-mesh", visible: false, ...handlers }), _jsx(WallTreatments, { childrenNodes: childNodes, materials: extraMaterials, node: node }), (node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, `${node.id}:${childId}`)))] }));
65
+ return (_jsxs("mesh", { castShadow: true, geometry: placeholderGeometry, material: baseMaterials, receiveShadow: true, ref: ref, visible: node.visible, children: [_jsx("mesh", { geometry: collisionPlaceholderGeometry, name: "collision-mesh", visible: false, ...handlers }), treatmentLevelData && (_jsx(WallTreatments, { childrenNodes: childNodes, levelData: treatmentLevelData, materials: extraMaterials, node: node })), (node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, `${node.id}:${childId}`)))] }));
64
66
  };
65
67
  export default WallRenderer;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * - **`WallSystem`** — reads `dirtyNodes`, batches by level, runs
5
5
  * `calculateLevelMiters(levelWalls)`, rebuilds geometry via
6
- * `generateExtrudedWall(node, children, miterData, slabElevation, baseElevation, baseSegments)`,
6
+ * `generateExtrudedWall(node, children, miterData, slabElevation, baseElevation, baseSegments, storeyHeight)`,
7
7
  * and cascades to adjacent walls that share a junction. This is the
8
8
  * bulk of the wall runtime (~820 lines in viewer).
9
9
  * - **`WallCutout`** — cutaway-mode hide/show logic based on camera
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/wall/system.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,QAAA,MAAM,WAAW,mCAOhB,CAAA;AAED,eAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/wall/system.tsx"],"names":[],"mappings":"AAyCA;;;;;;;;;;GAUG;AACH,QAAA,MAAM,WAAW,mCAQhB,CAAA;AAED,eAAe,WAAW,CAAA"}
@@ -1,18 +1,53 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useLiveNodeOverrides, useScene } from '@pascal-app/core';
3
4
  import { WallCutout, WallSystem } from '@pascal-app/viewer';
5
+ import { useFrame } from '@react-three/fiber';
6
+ import { buildWallTreatmentLevelData, useWallTreatmentLevelData } from './treatment-level-data';
7
+ import { wallTreatmentProudOffsets } from './treatments';
8
+ function effectiveWall(wall) {
9
+ const override = useLiveNodeOverrides.getState().get(wall.id);
10
+ return override ? { ...wall, ...override } : wall;
11
+ }
12
+ const WallTreatmentMiterSystem = () => {
13
+ useFrame(() => {
14
+ const { dirtyNodes, nodes } = useScene.getState();
15
+ if (dirtyNodes.size === 0)
16
+ return;
17
+ const dirtyLevelIds = new Set();
18
+ for (const id of dirtyNodes) {
19
+ const node = nodes[id];
20
+ if (node?.type === 'wall' && node.parentId)
21
+ dirtyLevelIds.add(node.parentId);
22
+ }
23
+ for (const levelId of dirtyLevelIds) {
24
+ const level = nodes[levelId];
25
+ if (level?.type !== 'level')
26
+ continue;
27
+ const walls = level.children
28
+ .map((id) => nodes[id])
29
+ .filter((node) => node?.type === 'wall')
30
+ .map(effectiveWall);
31
+ const proudOffsets = walls.flatMap(wallTreatmentProudOffsets);
32
+ useWallTreatmentLevelData
33
+ .getState()
34
+ .setLevelData(levelId, buildWallTreatmentLevelData(walls, proudOffsets));
35
+ }
36
+ }, -1);
37
+ return null;
38
+ };
4
39
  /**
5
40
  * Registry-driven wall system bundle.
6
41
  *
7
42
  * - **`WallSystem`** — reads `dirtyNodes`, batches by level, runs
8
43
  * `calculateLevelMiters(levelWalls)`, rebuilds geometry via
9
- * `generateExtrudedWall(node, children, miterData, slabElevation, baseElevation, baseSegments)`,
44
+ * `generateExtrudedWall(node, children, miterData, slabElevation, baseElevation, baseSegments, storeyHeight)`,
10
45
  * and cascades to adjacent walls that share a junction. This is the
11
46
  * bulk of the wall runtime (~820 lines in viewer).
12
47
  * - **`WallCutout`** — cutaway-mode hide/show logic based on camera
13
48
  * direction and `frontSide` / `backSide` interior/exterior tags.
14
49
  */
15
50
  const WallSystems = () => {
16
- return (_jsxs(_Fragment, { children: [_jsx(WallSystem, {}), _jsx(WallCutout, {})] }));
51
+ return (_jsxs(_Fragment, { children: [_jsx(WallTreatmentMiterSystem, {}), _jsx(WallSystem, {}), _jsx(WallCutout, {})] }));
17
52
  };
18
53
  export default WallSystems;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/wall/tool.tsx"],"names":[],"mappings":"AA+fA,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAoW5B,CAAA;AA6HD,eAAe,QAAQ,CAAA"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/wall/tool.tsx"],"names":[],"mappings":"AAgcA,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EA+e5B,CAAA;AAED,eAAe,QAAQ,CAAA"}