@pascal-app/nodes 1.0.3 → 1.0.4

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 (708) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +18 -3
  3. package/dist/block/floorplan.d.ts +11 -1
  4. package/dist/block/floorplan.d.ts.map +1 -1
  5. package/dist/block/floorplan.js +81 -13
  6. package/dist/block/geometry.d.ts +2 -2
  7. package/dist/block/geometry.d.ts.map +1 -1
  8. package/dist/block/geometry.js +39 -24
  9. package/dist/block/hosted-edit.d.ts.map +1 -1
  10. package/dist/block/hosted-edit.js +25 -0
  11. package/dist/block/material-slots.d.ts +1 -3
  12. package/dist/block/material-slots.d.ts.map +1 -1
  13. package/dist/block/material-slots.js +1 -11
  14. package/dist/block/paint.d.ts.map +1 -1
  15. package/dist/block/paint.js +4 -10
  16. package/dist/block/panel.d.ts.map +1 -1
  17. package/dist/block/panel.js +8 -3
  18. package/dist/block/selection.d.ts.map +1 -1
  19. package/dist/block/selection.js +2 -2
  20. package/dist/box-vent/definition.d.ts.map +1 -1
  21. package/dist/box-vent/definition.js +2 -5
  22. package/dist/box-vent/panel.d.ts.map +1 -1
  23. package/dist/box-vent/panel.js +5 -28
  24. package/dist/cabinet/countertop-layout.d.ts +13 -2
  25. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  26. package/dist/cabinet/definition.d.ts.map +1 -1
  27. package/dist/cabinet/definition.js +1 -2
  28. package/dist/cabinet/floorplan.d.ts.map +1 -1
  29. package/dist/cabinet/floorplan.js +125 -28
  30. package/dist/cabinet/geometry/shared.d.ts +1 -2
  31. package/dist/cabinet/geometry/shared.d.ts.map +1 -1
  32. package/dist/cabinet/geometry/shared.js +1 -2
  33. package/dist/cabinet/run-layout.d.ts.map +1 -1
  34. package/dist/cabinet/run-layout.js +8 -5
  35. package/dist/cabinet/run-ops.d.ts +13 -2
  36. package/dist/cabinet/run-ops.d.ts.map +1 -1
  37. package/dist/cabinet/tool.d.ts.map +1 -1
  38. package/dist/cabinet/tool.js +22 -24
  39. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  40. package/dist/cabinet/wall-snap.js +8 -8
  41. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  42. package/dist/ceiling/boundary-editor.js +5 -3
  43. package/dist/ceiling/definition.d.ts +4 -4
  44. package/dist/ceiling/definition.d.ts.map +1 -1
  45. package/dist/ceiling/definition.js +15 -15
  46. package/dist/ceiling/floorplan-affordances.d.ts +84 -4
  47. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  48. package/dist/ceiling/floorplan-affordances.js +0 -1
  49. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  50. package/dist/ceiling/floorplan-move.js +0 -1
  51. package/dist/ceiling/floorplan.d.ts +1 -1
  52. package/dist/ceiling/floorplan.d.ts.map +1 -1
  53. package/dist/ceiling/floorplan.js +2 -1
  54. package/dist/ceiling/height-bounds.d.ts +19 -0
  55. package/dist/ceiling/height-bounds.d.ts.map +1 -0
  56. package/dist/ceiling/height-bounds.js +24 -0
  57. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  58. package/dist/ceiling/hole-editor.js +3 -4
  59. package/dist/ceiling/materials.d.ts +1 -1
  60. package/dist/ceiling/materials.d.ts.map +1 -1
  61. package/dist/ceiling/materials.js +10 -3
  62. package/dist/ceiling/paint.d.ts +2 -8
  63. package/dist/ceiling/paint.d.ts.map +1 -1
  64. package/dist/ceiling/paint.js +121 -24
  65. package/dist/ceiling/panel.d.ts.map +1 -1
  66. package/dist/ceiling/panel.js +40 -23
  67. package/dist/ceiling/renderer.d.ts.map +1 -1
  68. package/dist/ceiling/renderer.js +41 -5
  69. package/dist/chimney/move-tool.d.ts.map +1 -1
  70. package/dist/chimney/move-tool.js +8 -2
  71. package/dist/chimney/paint.d.ts.map +1 -1
  72. package/dist/chimney/paint.js +3 -10
  73. package/dist/column/definition.d.ts.map +1 -1
  74. package/dist/column/definition.js +24 -2
  75. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  76. package/dist/column/floorplan-affordances.js +5 -0
  77. package/dist/column/floorplan.d.ts +1 -1
  78. package/dist/column/floorplan.d.ts.map +1 -1
  79. package/dist/column/floorplan.js +47 -2
  80. package/dist/column/hosted-resize.d.ts +101 -2
  81. package/dist/column/hosted-resize.d.ts.map +1 -1
  82. package/dist/column/panel.d.ts.map +1 -1
  83. package/dist/column/panel.js +147 -146
  84. package/dist/column/renderer.d.ts.map +1 -1
  85. package/dist/column/renderer.js +6 -4
  86. package/dist/column/surface.d.ts.map +1 -1
  87. package/dist/column/surface.js +7 -0
  88. package/dist/construction-dimension/floorplan.js +7 -3
  89. package/dist/cupola/definition.d.ts.map +1 -1
  90. package/dist/cupola/definition.js +2 -8
  91. package/dist/cupola/panel.d.ts.map +1 -1
  92. package/dist/cupola/panel.js +5 -23
  93. package/dist/door/definition.d.ts.map +1 -1
  94. package/dist/door/definition.js +12 -3
  95. package/dist/door/door-math.d.ts +5 -10
  96. package/dist/door/door-math.d.ts.map +1 -1
  97. package/dist/door/door-math.js +14 -15
  98. package/dist/door/floorplan-move.d.ts.map +1 -1
  99. package/dist/door/floorplan-move.js +3 -1
  100. package/dist/door/floorplan.d.ts.map +1 -1
  101. package/dist/door/floorplan.js +55 -21
  102. package/dist/door/mechanism.d.ts +4 -0
  103. package/dist/door/mechanism.d.ts.map +1 -0
  104. package/dist/door/mechanism.js +24 -0
  105. package/dist/door/move-tool.d.ts.map +1 -1
  106. package/dist/door/move-tool.js +72 -48
  107. package/dist/door/paint.d.ts.map +1 -1
  108. package/dist/door/paint.js +3 -0
  109. package/dist/door/panel.d.ts.map +1 -1
  110. package/dist/door/panel.js +34 -259
  111. package/dist/door/placement.d.ts +45 -0
  112. package/dist/door/placement.d.ts.map +1 -0
  113. package/dist/door/placement.js +51 -0
  114. package/dist/door/preview.d.ts.map +1 -1
  115. package/dist/door/preview.js +2 -0
  116. package/dist/door/renderer.d.ts.map +1 -1
  117. package/dist/door/renderer.js +3 -2
  118. package/dist/door/tool.d.ts.map +1 -1
  119. package/dist/door/tool.js +92 -21
  120. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  121. package/dist/dormer/csg-geometry.js +2 -0
  122. package/dist/dormer/paint.d.ts.map +1 -1
  123. package/dist/dormer/paint.js +2 -5
  124. package/dist/dormer/panel.d.ts.map +1 -1
  125. package/dist/dormer/panel.js +4 -14
  126. package/dist/downspout/definition.d.ts.map +1 -1
  127. package/dist/downspout/definition.js +2 -2
  128. package/dist/duct-fitting/definition.d.ts.map +1 -1
  129. package/dist/duct-fitting/definition.js +2 -1
  130. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  131. package/dist/duct-fitting/geometry.js +1 -1
  132. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  133. package/dist/duct-fitting/move-tool.js +8 -2
  134. package/dist/duct-segment/definition.d.ts.map +1 -1
  135. package/dist/duct-segment/definition.js +2 -2
  136. package/dist/duct-segment/geometry.d.ts.map +1 -1
  137. package/dist/duct-segment/geometry.js +1 -1
  138. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  139. package/dist/duct-segment/move-tool.js +8 -2
  140. package/dist/elevator/definition.d.ts.map +1 -1
  141. package/dist/elevator/definition.js +1 -2
  142. package/dist/elevator/panel.d.ts.map +1 -1
  143. package/dist/elevator/panel.js +5 -27
  144. package/dist/elevator/parametrics.js +1 -1
  145. package/dist/elevator/renderer.d.ts.map +1 -1
  146. package/dist/elevator/renderer.js +3 -4
  147. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  148. package/dist/eyebrow-vent/definition.js +2 -5
  149. package/dist/eyebrow-vent/paint.d.ts.map +1 -1
  150. package/dist/eyebrow-vent/paint.js +3 -6
  151. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  152. package/dist/eyebrow-vent/panel.js +5 -23
  153. package/dist/fence/actions/move-endpoint.d.ts +1 -1
  154. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  155. package/dist/fence/actions/move-endpoint.js +2 -1
  156. package/dist/fence/definition.d.ts +2 -1
  157. package/dist/fence/definition.d.ts.map +1 -1
  158. package/dist/fence/definition.js +83 -28
  159. package/dist/fence/drafting.d.ts +36 -0
  160. package/dist/fence/drafting.d.ts.map +1 -0
  161. package/dist/fence/drafting.js +210 -0
  162. package/dist/fence/feature-tool.d.ts +4 -0
  163. package/dist/fence/feature-tool.d.ts.map +1 -0
  164. package/dist/fence/feature-tool.js +140 -0
  165. package/dist/fence/features.d.ts +2 -0
  166. package/dist/fence/features.d.ts.map +1 -0
  167. package/dist/fence/features.js +12 -0
  168. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  169. package/dist/fence/floorplan-affordances.js +2 -1
  170. package/dist/fence/floorplan.d.ts +2 -3
  171. package/dist/fence/floorplan.d.ts.map +1 -1
  172. package/dist/fence/floorplan.js +131 -71
  173. package/dist/fence/geometry-parts.d.ts +50 -0
  174. package/dist/fence/geometry-parts.d.ts.map +1 -0
  175. package/dist/fence/geometry-parts.js +1144 -0
  176. package/dist/fence/geometry.d.ts +2 -3
  177. package/dist/fence/geometry.d.ts.map +1 -1
  178. package/dist/fence/geometry.js +84 -7
  179. package/dist/fence/index.d.ts +1 -0
  180. package/dist/fence/index.d.ts.map +1 -1
  181. package/dist/fence/index.js +1 -0
  182. package/dist/fence/inspector-editors.d.ts +15 -0
  183. package/dist/fence/inspector-editors.d.ts.map +1 -1
  184. package/dist/fence/inspector-editors.js +128 -3
  185. package/dist/fence/lift.d.ts.map +1 -1
  186. package/dist/fence/lift.js +5 -2
  187. package/dist/fence/move-tool.js +2 -1
  188. package/dist/fence/panel-model.d.ts +4 -0
  189. package/dist/fence/panel-model.d.ts.map +1 -0
  190. package/dist/fence/panel-model.js +12 -0
  191. package/dist/fence/parametrics.d.ts +0 -12
  192. package/dist/fence/parametrics.d.ts.map +1 -1
  193. package/dist/fence/parametrics.js +185 -18
  194. package/dist/fence/system.d.ts.map +1 -1
  195. package/dist/fence/system.js +141 -31
  196. package/dist/fence/tool.d.ts.map +1 -1
  197. package/dist/fence/tool.js +256 -47
  198. package/dist/fence-feature/actions.d.ts +7 -0
  199. package/dist/fence-feature/actions.d.ts.map +1 -0
  200. package/dist/fence-feature/actions.js +26 -0
  201. package/dist/fence-feature/definition.d.ts +4 -0
  202. package/dist/fence-feature/definition.d.ts.map +1 -0
  203. package/dist/fence-feature/definition.js +112 -0
  204. package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
  205. package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
  206. package/dist/fence-feature/floorplan-affordances.js +37 -0
  207. package/dist/fence-feature/floorplan.d.ts +4 -0
  208. package/dist/fence-feature/floorplan.d.ts.map +1 -0
  209. package/dist/fence-feature/floorplan.js +120 -0
  210. package/dist/fence-feature/geometry.d.ts +5 -0
  211. package/dist/fence-feature/geometry.d.ts.map +1 -0
  212. package/dist/fence-feature/geometry.js +43 -0
  213. package/dist/fence-feature/handles.d.ts +5 -0
  214. package/dist/fence-feature/handles.d.ts.map +1 -0
  215. package/dist/fence-feature/handles.js +84 -0
  216. package/dist/fence-feature/inspector.d.ts +6 -0
  217. package/dist/fence-feature/inspector.d.ts.map +1 -0
  218. package/dist/fence-feature/inspector.js +214 -0
  219. package/dist/fence-feature/interaction.d.ts +3 -0
  220. package/dist/fence-feature/interaction.d.ts.map +1 -0
  221. package/dist/fence-feature/interaction.js +41 -0
  222. package/dist/fence-feature/move-session.d.ts +9 -0
  223. package/dist/fence-feature/move-session.d.ts.map +1 -0
  224. package/dist/fence-feature/move-session.js +48 -0
  225. package/dist/fence-feature/move-tool.d.ts +5 -0
  226. package/dist/fence-feature/move-tool.d.ts.map +1 -0
  227. package/dist/fence-feature/move-tool.js +58 -0
  228. package/dist/fence-feature/pick-target.d.ts +7 -0
  229. package/dist/fence-feature/pick-target.d.ts.map +1 -0
  230. package/dist/fence-feature/pick-target.js +52 -0
  231. package/dist/floor-opening/definition.d.ts +3 -0
  232. package/dist/floor-opening/definition.d.ts.map +1 -0
  233. package/dist/floor-opening/definition.js +41 -0
  234. package/dist/floor-opening/floorplan.d.ts +156 -0
  235. package/dist/floor-opening/floorplan.d.ts.map +1 -0
  236. package/dist/floor-opening/floorplan.js +63 -0
  237. package/dist/gutter/definition.d.ts.map +1 -1
  238. package/dist/gutter/definition.js +2 -2
  239. package/dist/imported-mesh/definition.d.ts.map +1 -1
  240. package/dist/imported-mesh/definition.js +2 -0
  241. package/dist/imported-mesh/geometry.d.ts +1 -1
  242. package/dist/imported-mesh/geometry.d.ts.map +1 -1
  243. package/dist/imported-mesh/geometry.js +40 -12
  244. package/dist/index.d.ts +13 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +20 -2
  247. package/dist/item/authored-face-host.d.ts +10 -0
  248. package/dist/item/authored-face-host.d.ts.map +1 -0
  249. package/dist/item/authored-face-host.js +87 -0
  250. package/dist/item/authored-params.d.ts +15 -0
  251. package/dist/item/authored-params.d.ts.map +1 -0
  252. package/dist/item/authored-params.js +72 -0
  253. package/dist/item/definition.d.ts +2 -2
  254. package/dist/item/definition.d.ts.map +1 -1
  255. package/dist/item/definition.js +33 -4
  256. package/dist/item/floorplan.d.ts +1 -1
  257. package/dist/item/floorplan.d.ts.map +1 -1
  258. package/dist/item/floorplan.js +35 -5
  259. package/dist/item/index.d.ts +1 -0
  260. package/dist/item/index.d.ts.map +1 -1
  261. package/dist/item/index.js +1 -0
  262. package/dist/item/model-loader.d.ts +2 -0
  263. package/dist/item/model-loader.d.ts.map +1 -1
  264. package/dist/item/model-loader.js +55 -23
  265. package/dist/item/move-tool.js +4 -4
  266. package/dist/item/paint.d.ts.map +1 -1
  267. package/dist/item/paint.js +5 -24
  268. package/dist/item/panel.d.ts +1 -3
  269. package/dist/item/panel.d.ts.map +1 -1
  270. package/dist/item/panel.js +20 -24
  271. package/dist/item/placement-notice.d.ts +14 -0
  272. package/dist/item/placement-notice.d.ts.map +1 -0
  273. package/dist/item/placement-notice.js +38 -0
  274. package/dist/item/plan-symbols.d.ts +67 -0
  275. package/dist/item/plan-symbols.d.ts.map +1 -0
  276. package/dist/item/plan-symbols.js +407 -0
  277. package/dist/item/renderer.d.ts +10 -0
  278. package/dist/item/renderer.d.ts.map +1 -1
  279. package/dist/item/renderer.js +64 -38
  280. package/dist/item/script-param-defaults.d.ts +12 -0
  281. package/dist/item/script-param-defaults.d.ts.map +1 -0
  282. package/dist/item/script-param-defaults.js +34 -0
  283. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  284. package/dist/lean-to-extension/definition.js +1 -2
  285. package/dist/lean-to-extension/geometry.d.ts.map +1 -1
  286. package/dist/lean-to-extension/geometry.js +1 -1
  287. package/dist/lean-to-extension/layout.d.ts.map +1 -1
  288. package/dist/lean-to-extension/layout.js +2 -3
  289. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
  290. package/dist/lean-to-extension/placement-validation.js +5 -5
  291. package/dist/lean-to-extension/tool.d.ts.map +1 -1
  292. package/dist/lean-to-extension/tool.js +5 -5
  293. package/dist/lineset/move-tool.d.ts.map +1 -1
  294. package/dist/lineset/move-tool.js +8 -2
  295. package/dist/liquid-line/move-tool.d.ts.map +1 -1
  296. package/dist/liquid-line/move-tool.js +8 -2
  297. package/dist/measurement/definition.js +1 -1
  298. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  299. package/dist/pipe-fitting/move-tool.js +8 -2
  300. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  301. package/dist/pipe-segment/move-tool.js +8 -2
  302. package/dist/procedural-item/animation.d.ts +8 -0
  303. package/dist/procedural-item/animation.d.ts.map +1 -0
  304. package/dist/procedural-item/animation.js +116 -0
  305. package/dist/procedural-item/definition.d.ts.map +1 -1
  306. package/dist/procedural-item/definition.js +74 -8
  307. package/dist/procedural-item/geometry.d.ts +5 -1
  308. package/dist/procedural-item/geometry.d.ts.map +1 -1
  309. package/dist/procedural-item/geometry.js +239 -15
  310. package/dist/procedural-item/renderer.d.ts.map +1 -1
  311. package/dist/procedural-item/renderer.js +272 -23
  312. package/dist/ridge-vent/panel.d.ts.map +1 -1
  313. package/dist/ridge-vent/panel.js +5 -23
  314. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  315. package/dist/ridge-vent/renderer.js +9 -8
  316. package/dist/roof/definition.d.ts.map +1 -1
  317. package/dist/roof/definition.js +4 -1
  318. package/dist/roof/floorplan.d.ts +8 -0
  319. package/dist/roof/floorplan.d.ts.map +1 -1
  320. package/dist/roof/floorplan.js +194 -18
  321. package/dist/roof/panel-model.d.ts.map +1 -1
  322. package/dist/roof/panel-model.js +10 -6
  323. package/dist/roof/panel.d.ts.map +1 -1
  324. package/dist/roof/panel.js +3 -10
  325. package/dist/roof/renderer.d.ts.map +1 -1
  326. package/dist/roof/renderer.js +5 -2
  327. package/dist/roof-segment/panel.d.ts.map +1 -1
  328. package/dist/roof-segment/panel.js +5 -24
  329. package/dist/roof-segment/renderer.d.ts.map +1 -1
  330. package/dist/roof-segment/renderer.js +17 -8
  331. package/dist/separator/definition.d.ts +3 -0
  332. package/dist/separator/definition.d.ts.map +1 -0
  333. package/dist/separator/definition.js +39 -0
  334. package/dist/separator/renderer.d.ts +5 -0
  335. package/dist/separator/renderer.d.ts.map +1 -0
  336. package/dist/separator/renderer.js +36 -0
  337. package/dist/shared/duct-body-paint.d.ts +0 -4
  338. package/dist/shared/duct-body-paint.d.ts.map +1 -1
  339. package/dist/shared/duct-body-paint.js +1 -5
  340. package/dist/shared/item-interaction-actions.d.ts +6 -0
  341. package/dist/shared/item-interaction-actions.d.ts.map +1 -0
  342. package/dist/shared/item-interaction-actions.js +27 -0
  343. package/dist/shared/item-interactions.d.ts +9 -0
  344. package/dist/shared/item-interactions.d.ts.map +1 -0
  345. package/dist/shared/item-interactions.js +74 -0
  346. package/dist/shared/item-light-placement.d.ts +2 -0
  347. package/dist/shared/item-light-placement.d.ts.map +1 -0
  348. package/dist/shared/item-light-placement.js +3 -0
  349. package/dist/shared/move-roof-tool.js +2 -1
  350. package/dist/shared/node-batch/batchable.d.ts +12 -0
  351. package/dist/shared/node-batch/batchable.d.ts.map +1 -0
  352. package/dist/shared/node-batch/batchable.js +41 -0
  353. package/dist/shared/node-batch/candidates.d.ts +7 -5
  354. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  355. package/dist/shared/node-batch/candidates.js +43 -59
  356. package/dist/shared/node-batch/release.d.ts +8 -0
  357. package/dist/shared/node-batch/release.d.ts.map +1 -0
  358. package/dist/shared/node-batch/release.js +16 -0
  359. package/dist/shared/node-batch/system.d.ts.map +1 -1
  360. package/dist/shared/node-batch/system.js +17 -12
  361. package/dist/shared/node-batch/types.d.ts +4 -1
  362. package/dist/shared/node-batch/types.d.ts.map +1 -1
  363. package/dist/shared/opening-documentation.d.ts +13 -1
  364. package/dist/shared/opening-documentation.d.ts.map +1 -1
  365. package/dist/shared/opening-documentation.js +245 -59
  366. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  367. package/dist/shared/opening-guides-runtime.js +17 -14
  368. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  369. package/dist/shared/opening-placement-dimensions.js +3 -3
  370. package/dist/shared/opening-plane-offset.d.ts +23 -0
  371. package/dist/shared/opening-plane-offset.d.ts.map +1 -0
  372. package/dist/shared/opening-plane-offset.js +24 -0
  373. package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
  374. package/dist/shared/polygon-centroid-move.js +4 -1
  375. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  376. package/dist/shared/polygon-vertex-affordance.js +19 -15
  377. package/dist/shared/run-hangers.d.ts.map +1 -1
  378. package/dist/shared/run-hangers.js +5 -4
  379. package/dist/shared/scripted-opening-handles.d.ts +18 -0
  380. package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
  381. package/dist/shared/scripted-opening-handles.js +53 -0
  382. package/dist/shared/scripted-opening.d.ts +25 -0
  383. package/dist/shared/scripted-opening.d.ts.map +1 -0
  384. package/dist/shared/scripted-opening.js +72 -0
  385. package/dist/shared/slot-paint.d.ts +14 -2
  386. package/dist/shared/slot-paint.d.ts.map +1 -1
  387. package/dist/shared/slot-paint.js +29 -29
  388. package/dist/shared/surface-paint.d.ts.map +1 -1
  389. package/dist/shared/surface-paint.js +2 -5
  390. package/dist/shared/swap-preview-material.d.ts +11 -0
  391. package/dist/shared/swap-preview-material.d.ts.map +1 -0
  392. package/dist/shared/swap-preview-material.js +16 -0
  393. package/dist/shared/system-checks.d.ts.map +1 -1
  394. package/dist/shared/system-checks.js +5 -3
  395. package/dist/shared/wall-attach-target.d.ts +3 -10
  396. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  397. package/dist/shared/wall-attach-target.js +3 -63
  398. package/dist/shared/wall-opening-ceiling.d.ts +5 -15
  399. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  400. package/dist/shared/wall-opening-ceiling.js +10 -18
  401. package/dist/shelf/definition.d.ts.map +1 -1
  402. package/dist/shelf/definition.js +1 -1
  403. package/dist/shelf/geometry.d.ts.map +1 -1
  404. package/dist/shelf/geometry.js +1 -2
  405. package/dist/shelf/paint.d.ts.map +1 -1
  406. package/dist/shelf/paint.js +4 -10
  407. package/dist/site/line-ribbon.d.ts +31 -0
  408. package/dist/site/line-ribbon.d.ts.map +1 -0
  409. package/dist/site/line-ribbon.js +117 -0
  410. package/dist/site/lot-mask.d.ts +18 -0
  411. package/dist/site/lot-mask.d.ts.map +1 -0
  412. package/dist/site/lot-mask.js +35 -0
  413. package/dist/site/panel.d.ts +10 -0
  414. package/dist/site/panel.d.ts.map +1 -0
  415. package/dist/site/panel.js +155 -0
  416. package/dist/site/parametrics.d.ts +7 -0
  417. package/dist/site/parametrics.d.ts.map +1 -1
  418. package/dist/site/parametrics.js +8 -0
  419. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  420. package/dist/site/recessed-slab-ground-holes.js +5 -2
  421. package/dist/site/renderer.d.ts.map +1 -1
  422. package/dist/site/renderer.js +150 -19
  423. package/dist/site/setbacks.d.ts +33 -0
  424. package/dist/site/setbacks.d.ts.map +1 -0
  425. package/dist/site/setbacks.js +204 -0
  426. package/dist/site/terrain-geometry.d.ts +28 -1
  427. package/dist/site/terrain-geometry.d.ts.map +1 -1
  428. package/dist/site/terrain-geometry.js +78 -4
  429. package/dist/site/terrain-holes.d.ts +15 -0
  430. package/dist/site/terrain-holes.d.ts.map +1 -0
  431. package/dist/site/terrain-holes.js +74 -0
  432. package/dist/site/terrain-mesh.d.ts +9 -2
  433. package/dist/site/terrain-mesh.d.ts.map +1 -1
  434. package/dist/site/terrain-mesh.js +36 -9
  435. package/dist/site/terrain-renderer.d.ts +9 -2
  436. package/dist/site/terrain-renderer.d.ts.map +1 -1
  437. package/dist/site/terrain-renderer.js +14 -4
  438. package/dist/slab/boundary-editor.d.ts +1 -1
  439. package/dist/slab/boundary-editor.d.ts.map +1 -1
  440. package/dist/slab/boundary-editor.js +13 -13
  441. package/dist/slab/definition.d.ts.map +1 -1
  442. package/dist/slab/definition.js +19 -3
  443. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  444. package/dist/slab/dependency-tracker.js +67 -7
  445. package/dist/slab/elevation-limit.d.ts.map +1 -1
  446. package/dist/slab/elevation-limit.js +2 -2
  447. package/dist/slab/floorplan-affordances.d.ts +176 -4
  448. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  449. package/dist/slab/floorplan-affordances.js +0 -1
  450. package/dist/slab/floorplan-move.d.ts.map +1 -1
  451. package/dist/slab/floorplan-move.js +3 -4
  452. package/dist/slab/floorplan.d.ts +7 -0
  453. package/dist/slab/floorplan.d.ts.map +1 -1
  454. package/dist/slab/floorplan.js +22 -5
  455. package/dist/slab/geometry.d.ts.map +1 -1
  456. package/dist/slab/geometry.js +186 -76
  457. package/dist/slab/move-tool.js +7 -6
  458. package/dist/slab/paint.d.ts +18 -5
  459. package/dist/slab/paint.d.ts.map +1 -1
  460. package/dist/slab/paint.js +458 -9
  461. package/dist/slab/panel.d.ts.map +1 -1
  462. package/dist/slab/panel.js +28 -9
  463. package/dist/slab/placement-ownership.d.ts +2 -1
  464. package/dist/slab/placement-ownership.d.ts.map +1 -1
  465. package/dist/slab/placement-ownership.js +2 -2
  466. package/dist/slab/surface-split.d.ts +24 -0
  467. package/dist/slab/surface-split.d.ts.map +1 -0
  468. package/dist/slab/surface-split.js +389 -0
  469. package/dist/slab/tool.d.ts.map +1 -1
  470. package/dist/slab/tool.js +3 -3
  471. package/dist/stair/baluster-geometry.d.ts +21 -0
  472. package/dist/stair/baluster-geometry.d.ts.map +1 -0
  473. package/dist/stair/baluster-geometry.js +74 -0
  474. package/dist/stair/baluster-guard.d.ts +50 -0
  475. package/dist/stair/baluster-guard.d.ts.map +1 -0
  476. package/dist/stair/baluster-guard.js +71 -0
  477. package/dist/stair/boards-guard.d.ts +37 -0
  478. package/dist/stair/boards-guard.d.ts.map +1 -0
  479. package/dist/stair/boards-guard.js +61 -0
  480. package/dist/stair/cable-guard.d.ts +39 -0
  481. package/dist/stair/cable-guard.d.ts.map +1 -0
  482. package/dist/stair/cable-guard.js +105 -0
  483. package/dist/stair/construction-controls.d.ts +15 -0
  484. package/dist/stair/construction-controls.d.ts.map +1 -0
  485. package/dist/stair/construction-controls.js +29 -0
  486. package/dist/stair/continuous-railings.d.ts +10 -0
  487. package/dist/stair/continuous-railings.d.ts.map +1 -0
  488. package/dist/stair/continuous-railings.js +159 -0
  489. package/dist/stair/definition.d.ts.map +1 -1
  490. package/dist/stair/definition.js +16 -37
  491. package/dist/stair/documentation.d.ts +1 -1
  492. package/dist/stair/documentation.d.ts.map +1 -1
  493. package/dist/stair/documentation.js +10 -17
  494. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  495. package/dist/stair/floorplan-affordances.js +9 -25
  496. package/dist/stair/floorplan.d.ts +1 -23
  497. package/dist/stair/floorplan.d.ts.map +1 -1
  498. package/dist/stair/floorplan.js +102 -86
  499. package/dist/stair/glass-guard.d.ts +72 -0
  500. package/dist/stair/glass-guard.d.ts.map +1 -0
  501. package/dist/stair/glass-guard.js +167 -0
  502. package/dist/stair/guard-path.d.ts +119 -0
  503. package/dist/stair/guard-path.d.ts.map +1 -0
  504. package/dist/stair/guard-path.js +208 -0
  505. package/dist/stair/materials.d.ts +11 -0
  506. package/dist/stair/materials.d.ts.map +1 -0
  507. package/dist/stair/materials.js +51 -0
  508. package/dist/stair/metal-guard.d.ts +38 -0
  509. package/dist/stair/metal-guard.d.ts.map +1 -0
  510. package/dist/stair/metal-guard.js +79 -0
  511. package/dist/stair/paint.d.ts +32 -0
  512. package/dist/stair/paint.d.ts.map +1 -1
  513. package/dist/stair/paint.js +75 -36
  514. package/dist/stair/panel.d.ts.map +1 -1
  515. package/dist/stair/panel.js +154 -17
  516. package/dist/stair/parametrics.d.ts +1 -1
  517. package/dist/stair/parametrics.d.ts.map +1 -1
  518. package/dist/stair/parametrics.js +32 -15
  519. package/dist/stair/plan-entry.d.ts +31 -0
  520. package/dist/stair/plan-entry.d.ts.map +1 -0
  521. package/dist/stair/plan-entry.js +325 -0
  522. package/dist/stair/post-and-rail-guard.d.ts +31 -0
  523. package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
  524. package/dist/stair/post-and-rail-guard.js +63 -0
  525. package/dist/stair/railing-controls.d.ts +9 -0
  526. package/dist/stair/railing-controls.d.ts.map +1 -0
  527. package/dist/stair/railing-controls.js +49 -0
  528. package/dist/stair/renderer.d.ts.map +1 -1
  529. package/dist/stair/renderer.js +259 -259
  530. package/dist/stair/use-stair-render-data.d.ts +317 -0
  531. package/dist/stair/use-stair-render-data.d.ts.map +1 -0
  532. package/dist/stair/use-stair-render-data.js +73 -0
  533. package/dist/stair-segment/definition.d.ts.map +1 -1
  534. package/dist/stair-segment/definition.js +51 -10
  535. package/dist/stair-segment/panel.d.ts.map +1 -1
  536. package/dist/stair-segment/panel.js +36 -42
  537. package/dist/stair-segment/parametrics.d.ts +1 -1
  538. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  539. package/dist/stair-segment/parametrics.js +21 -8
  540. package/dist/stair-segment/renderer.d.ts.map +1 -1
  541. package/dist/stair-segment/renderer.js +16 -28
  542. package/dist/turbine-vent/definition.d.ts.map +1 -1
  543. package/dist/turbine-vent/definition.js +2 -5
  544. package/dist/turbine-vent/paint.d.ts.map +1 -1
  545. package/dist/turbine-vent/paint.js +2 -5
  546. package/dist/turbine-vent/panel.d.ts.map +1 -1
  547. package/dist/turbine-vent/panel.js +5 -23
  548. package/dist/unit/unit-panel.d.ts.map +1 -1
  549. package/dist/unit/unit-panel.js +6 -1
  550. package/dist/wall/actions.d.ts.map +1 -1
  551. package/dist/wall/actions.js +7 -2
  552. package/dist/wall/construction-dimensions.js +8 -5
  553. package/dist/wall/contextual-dimensions.js +4 -4
  554. package/dist/wall/curtain-wall-materials.d.ts +1 -1
  555. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  556. package/dist/wall/curtain-wall-materials.js +2 -2
  557. package/dist/wall/curve-tool.d.ts.map +1 -1
  558. package/dist/wall/curve-tool.js +4 -0
  559. package/dist/wall/definition.d.ts.map +1 -1
  560. package/dist/wall/definition.js +41 -17
  561. package/dist/wall/floorplan-move.d.ts +1 -1
  562. package/dist/wall/floorplan-move.d.ts.map +1 -1
  563. package/dist/wall/floorplan-move.js +20 -83
  564. package/dist/wall/floorplan-tool.d.ts.map +1 -1
  565. package/dist/wall/floorplan-tool.js +10 -11
  566. package/dist/wall/floorplan.d.ts +3 -1
  567. package/dist/wall/floorplan.d.ts.map +1 -1
  568. package/dist/wall/floorplan.js +184 -21
  569. package/dist/wall/measurement.d.ts.map +1 -1
  570. package/dist/wall/measurement.js +5 -5
  571. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  572. package/dist/wall/move-endpoint-tool.js +20 -7
  573. package/dist/wall/move-shared.d.ts.map +1 -1
  574. package/dist/wall/move-shared.js +11 -7
  575. package/dist/wall/move-tool.d.ts.map +1 -1
  576. package/dist/wall/move-tool.js +118 -148
  577. package/dist/wall/paint.d.ts +26 -15
  578. package/dist/wall/paint.d.ts.map +1 -1
  579. package/dist/wall/paint.js +306 -117
  580. package/dist/wall/panel-model.d.ts +18 -0
  581. package/dist/wall/panel-model.d.ts.map +1 -1
  582. package/dist/wall/panel-model.js +77 -19
  583. package/dist/wall/panel.d.ts.map +1 -1
  584. package/dist/wall/panel.js +217 -41
  585. package/dist/wall/parametrics.d.ts.map +1 -1
  586. package/dist/wall/parametrics.js +3 -0
  587. package/dist/wall/rectangle-command.d.ts +111 -12
  588. package/dist/wall/rectangle-command.d.ts.map +1 -1
  589. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  590. package/dist/wall/rectangle-tool.js +26 -8
  591. package/dist/wall/renderer.d.ts.map +1 -1
  592. package/dist/wall/renderer.js +4 -2
  593. package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
  594. package/dist/wall/split-floorplan-layer.js +7 -7
  595. package/dist/wall/split-session.d.ts.map +1 -1
  596. package/dist/wall/split-session.js +7 -1
  597. package/dist/wall/system.d.ts.map +1 -1
  598. package/dist/wall/system.js +36 -4
  599. package/dist/wall/tool.d.ts.map +1 -1
  600. package/dist/wall/tool.js +105 -49
  601. package/dist/wall/treatment-level-data.d.ts +3 -2
  602. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  603. package/dist/wall/treatment-level-data.js +17 -13
  604. package/dist/wall/treatments.d.ts +10 -10
  605. package/dist/wall/treatments.d.ts.map +1 -1
  606. package/dist/wall/treatments.js +67 -54
  607. package/dist/wall/wall-batch-system.d.ts +7 -0
  608. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  609. package/dist/wall/wall-batch-system.js +35 -3
  610. package/dist/wall/wall-batch.d.ts +6 -0
  611. package/dist/wall/wall-batch.d.ts.map +1 -1
  612. package/dist/wall/wall-batch.js +7 -1
  613. package/dist/window/definition.d.ts.map +1 -1
  614. package/dist/window/definition.js +12 -4
  615. package/dist/window/floorplan-move.d.ts.map +1 -1
  616. package/dist/window/floorplan-move.js +3 -1
  617. package/dist/window/floorplan.d.ts.map +1 -1
  618. package/dist/window/floorplan.js +145 -60
  619. package/dist/window/mechanism.d.ts +4 -0
  620. package/dist/window/mechanism.d.ts.map +1 -0
  621. package/dist/window/mechanism.js +20 -0
  622. package/dist/window/move-tool.d.ts.map +1 -1
  623. package/dist/window/move-tool.js +79 -48
  624. package/dist/window/paint.d.ts.map +1 -1
  625. package/dist/window/paint.js +3 -0
  626. package/dist/window/panel.d.ts.map +1 -1
  627. package/dist/window/panel.js +32 -88
  628. package/dist/window/placement.d.ts +23 -0
  629. package/dist/window/placement.d.ts.map +1 -0
  630. package/dist/window/placement.js +66 -0
  631. package/dist/window/preview.d.ts.map +1 -1
  632. package/dist/window/preview.js +2 -0
  633. package/dist/window/renderer.d.ts.map +1 -1
  634. package/dist/window/renderer.js +3 -2
  635. package/dist/window/tool.d.ts.map +1 -1
  636. package/dist/window/tool.js +96 -24
  637. package/dist/window/window-math.d.ts +6 -14
  638. package/dist/window/window-math.d.ts.map +1 -1
  639. package/dist/window/window-math.js +14 -20
  640. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  641. package/dist/zone/contextual-dimensions.js +6 -28
  642. package/dist/zone/definition.d.ts.map +1 -1
  643. package/dist/zone/definition.js +3 -3
  644. package/dist/zone/floorplan-affordances.d.ts +200 -0
  645. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  646. package/dist/zone/floorplan.d.ts +1 -1
  647. package/dist/zone/floorplan.d.ts.map +1 -1
  648. package/dist/zone/floorplan.js +93 -53
  649. package/dist/zone/quantities-panel.d.ts.map +1 -1
  650. package/dist/zone/quantities-panel.js +3 -14
  651. package/dist/zone/quick-measurement.d.ts +2 -2
  652. package/dist/zone/quick-measurement.d.ts.map +1 -1
  653. package/dist/zone/quick-measurement.js +6 -5
  654. package/dist/zone/renderer.d.ts +1 -1
  655. package/dist/zone/renderer.d.ts.map +1 -1
  656. package/dist/zone/renderer.js +58 -146
  657. package/dist/zone/room-clear-dimensions.js +3 -3
  658. package/dist/zone/room-documentation.d.ts.map +1 -1
  659. package/dist/zone/room-documentation.js +2 -6
  660. package/package.json +11 -11
  661. package/dist/block/slots.d.ts +0 -4
  662. package/dist/block/slots.d.ts.map +0 -1
  663. package/dist/block/slots.js +0 -17
  664. package/dist/cabinet/slots.d.ts +0 -4
  665. package/dist/cabinet/slots.d.ts.map +0 -1
  666. package/dist/cabinet/slots.js +0 -24
  667. package/dist/ceiling/slots.d.ts +0 -6
  668. package/dist/ceiling/slots.d.ts.map +0 -1
  669. package/dist/ceiling/slots.js +0 -7
  670. package/dist/column/slots.d.ts +0 -9
  671. package/dist/column/slots.d.ts.map +0 -1
  672. package/dist/column/slots.js +0 -19
  673. package/dist/door/slots.d.ts +0 -9
  674. package/dist/door/slots.d.ts.map +0 -1
  675. package/dist/door/slots.js +0 -20
  676. package/dist/elevator/slots.d.ts +0 -8
  677. package/dist/elevator/slots.d.ts.map +0 -1
  678. package/dist/elevator/slots.js +0 -17
  679. package/dist/fence/slots.d.ts +0 -10
  680. package/dist/fence/slots.d.ts.map +0 -1
  681. package/dist/fence/slots.js +0 -23
  682. package/dist/item/__fixtures__/main-floorplan.d.ts +0 -26
  683. package/dist/item/__fixtures__/main-floorplan.d.ts.map +0 -1
  684. package/dist/item/__fixtures__/main-floorplan.js +0 -297
  685. package/dist/lean-to-extension/slots.d.ts +0 -5
  686. package/dist/lean-to-extension/slots.d.ts.map +0 -1
  687. package/dist/lean-to-extension/slots.js +0 -15
  688. package/dist/shelf/slots.d.ts +0 -9
  689. package/dist/shelf/slots.d.ts.map +0 -1
  690. package/dist/shelf/slots.js +0 -30
  691. package/dist/slab/slots.d.ts +0 -10
  692. package/dist/slab/slots.d.ts.map +0 -1
  693. package/dist/slab/slots.js +0 -20
  694. package/dist/stair/floor-stack.d.ts +0 -10
  695. package/dist/stair/floor-stack.d.ts.map +0 -1
  696. package/dist/stair/floor-stack.js +0 -115
  697. package/dist/stair/slots.d.ts +0 -7
  698. package/dist/stair/slots.d.ts.map +0 -1
  699. package/dist/stair/slots.js +0 -13
  700. package/dist/wall/drawing-mode.d.ts +0 -12
  701. package/dist/wall/drawing-mode.d.ts.map +0 -1
  702. package/dist/wall/drawing-mode.js +0 -38
  703. package/dist/wall/slots.d.ts +0 -10
  704. package/dist/wall/slots.d.ts.map +0 -1
  705. package/dist/wall/slots.js +0 -92
  706. package/dist/window/slots.d.ts +0 -5
  707. package/dist/window/slots.d.ts.map +0 -1
  708. package/dist/window/slots.js +0 -11
@@ -1,8 +1,9 @@
1
- import { getLevelElevations, getMaterialPresetByRef, getRenderableSlabPolygon, slabPolygonContextFromGeometry, surfaceHeightAt, terrainFieldOf, useScene, } from '@pascal-app/core';
1
+ import { area, computePlateSurfacePartition, cutterContextNodes, FenceNode, FOUNDATION_SLOT_DEFAULT, getLevelElevations, getMaterialPresetByRef, getRenderableSlabPolygon, intersection, isFloorPlate, levelBaseElevationAt, liftedManualSlab, parseFloorStepRole, plateFinishKey, plateLevelContext, resolveFloorStepFinish, SLAB_SIDE_SLOT_DEFAULT, SLAB_TOP_SLOT_DEFAULT, slabPolygonContextFromGeometry, surfaceHeightAt, terrainFieldOf, useScene, withHostedCutterHoles, } from '@pascal-app/core';
2
2
  import { applyMaterialPresetToMaterials, buildTerrainPerimeterFillGeometry, createDefaultMaterial, createMaterial, createSurfaceRoleMaterial, generateSlabGeometry, registerMaterialCacheCleanup, resolveMaterialRef, resolveSlotDefaultMaterial, } from '@pascal-app/viewer';
3
- import { BufferGeometry, Float32BufferAttribute, FrontSide, Group, Mesh, Vector3, } from 'three';
3
+ import { FrontSide, Group, Mesh } from 'three';
4
+ import { generateFenceSlotGeometries } from '../fence/geometry-parts';
4
5
  import { creaseCrossings } from '../site/terrain-drape';
5
- import { SLAB_SIDE_SLOT_DEFAULT, SLAB_TOP_SLOT_DEFAULT } from './slots';
6
+ import { clipPlateTerrainFill, splitPlateFaces, splitSlabFacesByFacing } from './surface-split';
6
7
  const slabMaterialCache = new Map();
7
8
  registerMaterialCacheCleanup(() => {
8
9
  const previous = [...slabMaterialCache.values()];
@@ -26,8 +27,19 @@ function getSlabSlotMaterial(node, slotId, shading, textures, colorPreset, scene
26
27
  if (!textures) {
27
28
  return createSurfaceRoleMaterial('floor', colorPreset, FrontSide, sceneTheme);
28
29
  }
30
+ if (slotId === 'foundation') {
31
+ const finish = node.foundation?.material ?? FOUNDATION_SLOT_DEFAULT;
32
+ return typeof finish === 'string'
33
+ ? (resolveMaterialRef(finish, sceneMaterials, shading) ??
34
+ resolveSlotDefaultMaterial(finish, shading, 0.8))
35
+ : createMaterial(finish, shading);
36
+ }
29
37
  // Unified slot override — shared scene material or catalog `library:` finish.
30
- const slotRef = node.slots?.[slotId];
38
+ // `side` is the pre-split key: it answers for any face when it is the only
39
+ // one set, and each split key answers for its own face when it is.
40
+ const slotRef = slotId === 'side'
41
+ ? (node.slots?.side ?? node.slots?.edge ?? node.slots?.riser ?? node.slots?.underside)
42
+ : (node.slots?.[slotId] ?? (slotId === 'surface' ? undefined : node.slots?.side));
31
43
  if (slotRef) {
32
44
  const resolved = resolveMaterialRef(slotRef, sceneMaterials, shading);
33
45
  if (resolved)
@@ -39,57 +51,9 @@ function getSlabSlotMaterial(node, slotId, shading, textures, colorPreset, scene
39
51
  return getLegacySlabMaterial(node, shading);
40
52
  }
41
53
  // Declared slot default — a catalog `library:` finish or a flat colour.
42
- const slotDefault = slotId === 'side' ? SLAB_SIDE_SLOT_DEFAULT : SLAB_TOP_SLOT_DEFAULT;
54
+ const slotDefault = slotId === 'surface' ? SLAB_TOP_SLOT_DEFAULT : SLAB_SIDE_SLOT_DEFAULT;
43
55
  return resolveSlotDefaultMaterial(slotDefault, shading, 0.8);
44
56
  }
45
- // Split the merged slab buffer into top-facing (floor) and everything-else
46
- // (vertical walls + underside) sub-geometries by per-triangle face normal, so
47
- // the two paintable slots get distinct materials + raycast tags. De-indexes
48
- // into per-face triangles (slabs are flat-shaded, so no shared-vertex seams).
49
- function splitSlabFacesByFacing(geometry) {
50
- const position = geometry.getAttribute('position');
51
- const uv = geometry.getAttribute('uv');
52
- const index = geometry.getIndex();
53
- const triangleCount = index ? index.count / 3 : position.count / 3;
54
- const top = { pos: [], uv: [] };
55
- const side = { pos: [], uv: [] };
56
- const a = new Vector3();
57
- const b = new Vector3();
58
- const c = new Vector3();
59
- const ab = new Vector3();
60
- const ac = new Vector3();
61
- const normal = new Vector3();
62
- for (let t = 0; t < triangleCount; t += 1) {
63
- const i0 = index ? index.getX(t * 3) : t * 3;
64
- const i1 = index ? index.getX(t * 3 + 1) : t * 3 + 1;
65
- const i2 = index ? index.getX(t * 3 + 2) : t * 3 + 2;
66
- a.fromBufferAttribute(position, i0);
67
- b.fromBufferAttribute(position, i1);
68
- c.fromBufferAttribute(position, i2);
69
- ab.subVectors(b, a);
70
- ac.subVectors(c, a);
71
- normal.crossVectors(ab, ac);
72
- const lengthSq = normal.lengthSq();
73
- const isTop = lengthSq > 1e-12 && normal.y / Math.sqrt(lengthSq) > 0.5;
74
- const target = isTop ? top : side;
75
- for (const i of [i0, i1, i2]) {
76
- target.pos.push(position.getX(i), position.getY(i), position.getZ(i));
77
- if (uv)
78
- target.uv.push(uv.getX(i), uv.getY(i));
79
- }
80
- }
81
- const build = (data) => {
82
- const geo = new BufferGeometry();
83
- geo.setAttribute('position', new Float32BufferAttribute(data.pos, 3));
84
- if (data.uv.length > 0) {
85
- geo.setAttribute('uv', new Float32BufferAttribute(data.uv, 2));
86
- geo.setAttribute('uv2', new Float32BufferAttribute(data.uv.slice(), 2));
87
- }
88
- geo.computeVertexNormals();
89
- return geo;
90
- };
91
- return { top: build(top), side: build(side) };
92
- }
93
57
  function getLegacySlabMaterial(node, shading) {
94
58
  // Cached by `{material, materialPreset}` signature so slabs sharing settings
95
59
  // share the GPU resource; cached entry mutation (preset apply) is preserved
@@ -125,7 +89,7 @@ function getLegacySlabMaterial(node, shading) {
125
89
  slabMaterialCache.set(cacheKey, material);
126
90
  return material;
127
91
  }
128
- function terrainFillContext(ctx) {
92
+ function terrainFillContext(ctx, foundation) {
129
93
  if (!ctx)
130
94
  return null;
131
95
  const level = ctx.parent;
@@ -152,7 +116,7 @@ function terrainFillContext(ctx) {
152
116
  if (!elevation)
153
117
  return null;
154
118
  const baseWorldY = (building.position?.[1] ?? 0) + elevation.baseY;
155
- if (Math.abs(baseWorldY) >= 1e-4)
119
+ if (Math.abs(baseWorldY) >= 1e-4 && !(foundation && level.level === 0))
156
120
  return null;
157
121
  return {
158
122
  baseWorldY,
@@ -160,8 +124,8 @@ function terrainFillContext(ctx) {
160
124
  field,
161
125
  };
162
126
  }
163
- function buildSlabTerrainFillGeometry(node, polygon, ctx) {
164
- const terrain = terrainFillContext(ctx);
127
+ function buildSlabTerrainFillGeometry(node, polygon, ctx, partition) {
128
+ const terrain = terrainFillContext(ctx, node.plateRole === 'base');
165
129
  if (!terrain || polygon.length < 3)
166
130
  return null;
167
131
  let area2 = 0;
@@ -199,41 +163,187 @@ function buildSlabTerrainFillGeometry(node, polygon, ctx) {
199
163
  const ground = terrain.field ? surfaceHeightAt(terrain.field, siteX, siteZ) : 0;
200
164
  return Math.min(top, ground - terrain.baseWorldY);
201
165
  });
202
- return buildTerrainPerimeterFillGeometry(localPoints, bottomY, top, 1e-4);
166
+ const geometry = buildTerrainPerimeterFillGeometry(localPoints, bottomY, top, 1e-4);
167
+ if (!geometry || !partition?.sides.some((side) => side.dropTo !== undefined))
168
+ return geometry;
169
+ const clipped = clipPlateTerrainFill(geometry, partition);
170
+ geometry.dispose();
171
+ return clipped;
172
+ }
173
+ /**
174
+ * Material for one partition cell of a plate top: the room's finish when the
175
+ * cell has one, the plate's own `surface` slot when it does not. Identical
176
+ * finishes resolve to the same cached instance, so two rooms painted alike stay
177
+ * in one batch bucket.
178
+ */
179
+ function getPlateCellMaterial(node, cell, shading, textures, colorPreset, sceneTheme, sceneMaterials) {
180
+ if (!textures)
181
+ return createSurfaceRoleMaterial('floor', colorPreset, FrontSide, sceneTheme);
182
+ const finish = cell.finish;
183
+ if (typeof finish === 'string') {
184
+ const resolved = resolveMaterialRef(finish, sceneMaterials, shading);
185
+ if (resolved)
186
+ return resolved;
187
+ }
188
+ else if (finish) {
189
+ return createMaterial(finish, shading);
190
+ }
191
+ return getSlabSlotMaterial(node, 'surface', shading, textures, colorPreset, sceneTheme, sceneMaterials);
192
+ }
193
+ /**
194
+ * A floor plate's partition, or `null` when this slab is not a plate (or the
195
+ * level neighbourhood is unavailable, as in a bare geometry test). Memoised in
196
+ * core on the topology + finish signature; never recomputed per frame.
197
+ */
198
+ function platePartitionOf(node, ctx, platform) {
199
+ if (!isFloorPlate(node) || !ctx)
200
+ return null;
201
+ const context = plateLevelContext(ctx.parent, ctx.resolve);
202
+ return computePlateSurfacePartition(node, { ...context, platform });
203
203
  }
204
204
  export function buildSlabGeometry(node, ctx, shading = 'rendered', textures = true, colorPreset = 'clay', sceneTheme) {
205
+ if (ctx)
206
+ node = withHostedCutterHoles(node, cutterContextNodes(node, ctx));
207
+ if (ctx && !node.plateRole && !node.autoFromWalls)
208
+ node = liftedManualSlab(plateLevelContext(ctx.parent, ctx.resolve).nodes ?? {}, node);
205
209
  const group = new Group();
206
210
  const polygonContext = slabPolygonContextFromGeometry(ctx);
207
- const merged = generateSlabGeometry(node, polygonContext);
208
- const { top, side } = splitSlabFacesByFacing(merged);
209
- merged.dispose();
211
+ const polygon = getRenderableSlabPolygon(node, polygonContext);
212
+ const baseNodes = {};
213
+ if (ctx?.parent && !ctx.levelBaseAt && isFloorPlate(node)) {
214
+ let ancestor = ctx.parent;
215
+ while (ancestor && !baseNodes[ancestor.id]) {
216
+ baseNodes[ancestor.id] = ancestor;
217
+ if ('children' in ancestor)
218
+ for (const id of ancestor.children) {
219
+ const child = ctx.resolve(id);
220
+ if (child?.type === 'level')
221
+ baseNodes[id] = child;
222
+ }
223
+ ancestor = ancestor.parentId
224
+ ? ctx.resolve(ancestor.parentId)
225
+ : undefined;
226
+ }
227
+ }
228
+ const levelBaseAt = ctx?.levelBaseAt ??
229
+ ((x, z) => node.parentId ? levelBaseElevationAt(baseNodes, node.parentId, x, z) : 0);
230
+ const platform = isFloorPlate(node) &&
231
+ node.support !== 'open' &&
232
+ !node.plateRole &&
233
+ !node.recessed &&
234
+ node.elevation - node.thickness > 1e-4 &&
235
+ [polygon, ...(node.holes ?? [])].some((ring) => ring.some(([x, z], i) => {
236
+ const [endX, endZ] = ring[(i + 1) % ring.length];
237
+ const count = Math.max(1, Math.ceil(Math.hypot(endX - x, endZ - z) / 0.25));
238
+ for (let j = 0; j < count; j++)
239
+ if (node.elevation - node.thickness >
240
+ levelBaseAt(x + ((endX - x) * j) / count, z + ((endZ - z) * j) / count) + 1e-4)
241
+ return true;
242
+ return false;
243
+ }));
244
+ const merged = generateSlabGeometry(node, polygonContext, platform ? levelBaseAt : undefined);
210
245
  const elevation = node.elevation ?? 0.05;
211
- // One mesh per slot, each tagged with its slot id so the unified slot paint
212
- // resolves the hit (`resolveRole` reads `userData.slotId`) and previews it.
213
- for (const [slotId, geometry] of [
214
- ['surface', top],
215
- ['side', side],
216
- ]) {
217
- const material = getSlabSlotMaterial(node, slotId, shading, textures, colorPreset, sceneTheme, ctx?.materials);
246
+ const partition = platePartitionOf(node, ctx, platform || node.plateRole === 'platform');
247
+ const addMesh = (geometry, slotId, material) => {
248
+ // A slot with no triangles (collapsed or fully holed polygon) gets no mesh,
249
+ // so the build settles instead of emitting empty buffers.
250
+ if (geometry.getAttribute('position').count === 0) {
251
+ geometry.dispose();
252
+ return;
253
+ }
218
254
  const mesh = new Mesh(geometry, material);
219
255
  mesh.castShadow = true;
220
256
  mesh.receiveShadow = true;
221
- mesh.userData.slotId = slotId;
257
+ const step = parseFloorStepRole(slotId);
258
+ const edgeOwner = /^edge:(.+)$/.exec(slotId)?.[1];
259
+ mesh.userData.slotId = step ? 'riser' : edgeOwner ? 'edge' : slotId;
260
+ mesh.userData.paintRole = slotId;
261
+ if (step || edgeOwner)
262
+ mesh.userData.ownerZoneId = step?.zoneId ?? edgeOwner;
222
263
  // Solid slabs bake [elevation − thickness, elevation] into the geometry;
223
264
  // recessed shells are authored from floor to rim and translated so the
224
265
  // floor sits at `elevation`.
225
266
  if (node.recessed)
226
267
  mesh.position.y = elevation;
227
268
  group.add(mesh);
269
+ };
270
+ if (partition) {
271
+ // A plate draws one mesh per partition cell and one per exposure role. Each
272
+ // mesh keeps a single material, so node batching still buckets them by
273
+ // material uuid and repeated finishes share one bucket.
274
+ const cellByRole = new Map(partition.cells.map((cell) => [cell.role, cell]));
275
+ const levelZones = ctx ? plateLevelContext(ctx.parent, ctx.resolve).zones : [];
276
+ for (const { role, geometry } of splitPlateFaces(merged, partition, node)) {
277
+ const step = parseFloorStepRole(role);
278
+ const zoneId = step?.zoneId ?? /^edge:(.+)$/.exec(role)?.[1];
279
+ const zone = zoneId ? ctx?.resolve(zoneId) : undefined;
280
+ const base = ctx
281
+ ? plateLevelContext(ctx.parent, ctx.resolve)
282
+ .slabs.filter((slab) => slab.plateRole === 'base')
283
+ .sort((a, b) => area(intersection({ outer: b.polygon, holes: b.holes }, { outer: node.polygon, holes: node.holes })) -
284
+ area(intersection({ outer: a.polygon, holes: a.holes }, { outer: node.polygon, holes: node.holes })) || a.id.localeCompare(b.id))[0]
285
+ : undefined;
286
+ const finish = zone?.type === 'zone'
287
+ ? step
288
+ ? resolveFloorStepFinish(zone, step.key, step.step, levelZones)
289
+ : (zone.floorEdgeFinish ?? base?.slots?.edge)
290
+ : undefined;
291
+ const cell = cellByRole.get(role) ??
292
+ (zone?.type === 'zone' && (step || finish !== undefined)
293
+ ? {
294
+ role,
295
+ finish: finish ?? SLAB_TOP_SLOT_DEFAULT,
296
+ materialKey: plateFinishKey(finish ?? SLAB_TOP_SLOT_DEFAULT),
297
+ polygons: [],
298
+ }
299
+ : undefined);
300
+ const material = cell
301
+ ? getPlateCellMaterial(node, cell, shading, textures, colorPreset, sceneTheme, ctx?.materials)
302
+ : getSlabSlotMaterial(node, role, shading, textures, colorPreset, sceneTheme, ctx?.materials);
303
+ addMesh(geometry, role, material);
304
+ }
228
305
  }
229
- if (node.fillToTerrain && !node.recessed) {
230
- const terrainFill = buildSlabTerrainFillGeometry(node, getRenderableSlabPolygon(node, polygonContext), ctx);
306
+ else {
307
+ const { top, side } = splitSlabFacesByFacing(merged);
308
+ // One mesh per slot, each tagged with its slot id so the unified slot paint
309
+ // resolves the hit (`resolveRole` reads `userData.slotId`) and previews it.
310
+ for (const [slotId, geometry] of [
311
+ ['surface', top],
312
+ ['side', side],
313
+ ]) {
314
+ addMesh(geometry, slotId, getSlabSlotMaterial(node, slotId, shading, textures, colorPreset, sceneTheme, ctx?.materials));
315
+ }
316
+ }
317
+ merged.dispose();
318
+ const foundation = node.plateRole === 'base' && node.foundation?.type === 'solid';
319
+ if ((foundation || (!node.plateRole && node.fillToTerrain)) &&
320
+ !node.recessed &&
321
+ !platform &&
322
+ group.children.length > 0) {
323
+ const terrainFill = buildSlabTerrainFillGeometry(node, getRenderableSlabPolygon(node, polygonContext), ctx, partition);
231
324
  if (terrainFill) {
232
- const mesh = new Mesh(terrainFill, getSlabSlotMaterial(node, 'side', shading, textures, colorPreset, sceneTheme, ctx?.materials));
233
- mesh.castShadow = true;
234
- mesh.receiveShadow = true;
235
- mesh.userData.slotId = 'side';
236
- group.add(mesh);
325
+ // The skirt hangs below the plate perimeter and always faces out.
326
+ const slotId = foundation ? 'foundation' : partition ? 'edge' : 'side';
327
+ addMesh(terrainFill, slotId, getSlabSlotMaterial(node, slotId, shading, textures, colorPreset, sceneTheme, ctx?.materials));
328
+ }
329
+ }
330
+ for (const [index, segment] of (node.railing ?? []).entries()) {
331
+ const geometries = generateFenceSlotGeometries(FenceNode.parse({
332
+ id: `fence_${index}`,
333
+ ...segment,
334
+ height: 1.1,
335
+ style: 'rail',
336
+ baseStyle: 'floating',
337
+ baseHeight: 0,
338
+ postCap: 'none',
339
+ }));
340
+ for (const geometry of Object.values(geometries)) {
341
+ if (!geometry.getAttribute('position')) {
342
+ geometry.dispose();
343
+ continue;
344
+ }
345
+ geometry.translate(0, elevation, 0);
346
+ addMesh(geometry, 'edge', getSlabSlotMaterial(node, 'edge', shading, textures, colorPreset, sceneTheme, ctx?.materials));
237
347
  }
238
348
  }
239
349
  return group;
@@ -1,9 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { collectAlignmentAnchors, emitter, polygonAnchors, sceneRegistry, useLiveTransforms, useScene, } from '@pascal-app/core';
4
- import { CursorSphere, consumePlacementDragRelease, getSegmentGridStep, isAlignmentGuideActive, isMagneticSnapActive, markToolCancelConsumed, projectAlignmentGuidesWorldToActiveBuildingLocal, resolveAlignmentForActiveBuilding, snapBuildingLocalToWorldGrid, snapFenceDraftPoint, triggerSFX, useAlignmentGuides, useEditor, } from '@pascal-app/editor';
4
+ import { CursorSphere, consumePlacementDragRelease, getSegmentGridStep, isAlignmentGuideActive, isMagneticSnapActive, markToolCancelConsumed, projectAlignmentGuidesWorldToActiveBuildingLocal, resolveAlignmentForActiveBuilding, snapBuildingLocalToWorldGrid, triggerSFX, useAlignmentGuides, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { useCallback, useEffect, useRef, useState } from 'react';
7
+ import { snapFenceDraftPoint } from '../fence/drafting';
7
8
  /**
8
9
  * Phase 5 Stage D — slab whole-move tool.
9
10
  *
@@ -177,10 +178,10 @@ export const MoveSlabTool = ({ node }) => {
177
178
  // Single scene.update — recorded as one undo step (history was
178
179
  // never paused). GeometrySystem rebuilds polygon-driven geometry
179
180
  // and resets the group's transform on the next frame.
180
- useScene.getState().updateNode(slabId, {
181
+ // Dragging a plate by hand converts it to an authored slab.
182
+ useScene.getState().detachDerivedNode(slabId, {
181
183
  polygon: translatePolygon(originalPolygon, deltaX, deltaZ),
182
184
  holes: originalHoles.map((h) => translatePolygon(h, deltaX, deltaZ)),
183
- autoFromWalls: false,
184
185
  });
185
186
  useScene.getState().markDirty(slabId);
186
187
  }
@@ -215,11 +216,11 @@ export const MoveSlabTool = ({ node }) => {
215
216
  window.addEventListener('pointerup', onPlacementDragPointerUp);
216
217
  return () => {
217
218
  useAlignmentGuides.getState().clear();
218
- if (!wasCommitted) {
219
- clearPreview();
219
+ if (wasCommitted) {
220
+ useLiveTransforms.getState().clear(slabId);
220
221
  }
221
222
  else {
222
- useLiveTransforms.getState().clear(slabId);
223
+ clearPreview();
223
224
  }
224
225
  emitter.off('grid:move', onGridMove);
225
226
  emitter.off('grid:click', onGridClick);
@@ -1,8 +1,21 @@
1
+ import { type FloorPlatePaintRefusal, type PaintCapability, type PaintPatchArgs, type PaintPreviewArgs } from '@pascal-app/core';
2
+ import { type PaintLook } from '../shared/slot-paint';
1
3
  /**
2
- * Slab paint on the unified slot model. A slab exposes two faces — `surface`
3
- * (top) and `side` (walls + underside) — each its own mesh tagged with
4
- * `userData.slotId`, so the clicked face resolves to its slot; commit writes
5
- * `node.slots[slotId]` (a shared scene-material or `library:` ref) like the shelf.
4
+ * Write a room finish in one history step, minting the shared scene material
5
+ * the same way `commitSlotPaint` does so a one-off colour is stored once.
6
6
  */
7
- export declare const slabPaint: import("@pascal-app/core").PaintCapability;
7
+ /** The region id a room-scope floor role carries: the whole room, every finish source. */
8
+ export declare const ROOM_WIDE = "*";
9
+ /** The zone a room-scope floor role (`room:<zoneId>/*`) names. */
10
+ export declare function roomWideZone(role: string): string | null;
11
+ /**
12
+ * What a floor surface shows once erased: a region falls to its room's floor
13
+ * finish, a room's floor finish to the plate's own top, the room's steps to its
14
+ * floor, its edge to the footprint's edge band, a plate's side faces to their
15
+ * bare look, a slot to its declared default.
16
+ */
17
+ export declare function erasedSlabLook({ node, role }: PaintPreviewArgs): PaintLook | null;
18
+ export declare const slabPaint: PaintCapability & {
19
+ commit: (args: PaintPatchArgs) => undefined | FloorPlatePaintRefusal;
20
+ };
8
21
  //# sourceMappingURL=paint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/slab/paint.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,eAAO,MAAM,SAAS,4CAiBpB,CAAA"}
1
+ {"version":3,"file":"paint.d.ts","sourceRoot":"","sources":["../../src/slab/paint.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,sBAAsB,EAQ3B,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAetB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAIL,KAAK,SAAS,EAGf,MAAM,sBAAsB,CAAA;AA6F7B;;;GAGG;AACH,0FAA0F;AAC1F,eAAO,MAAM,SAAS,MAAM,CAAA;AAE5B,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAqQD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAmBjF;AA8CD,eAAO,MAAM,SAAS,EAAE,eAAe,GAAG;IACxC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS,GAAG,sBAAsB,CAAA;CAiGrE,CAAA"}