@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,15 +1,26 @@
1
- import { withFloorplanGeometryMetadata } from '@pascal-app/editor';
1
+ import { getOpeningFloorDatum, getWallLocalFaceZ, wallSupportForNodes } from '@pascal-app/core';
2
+ import { resolveMarkDetail, withFloorplanGeometryMetadata, } from '@pascal-app/editor';
2
3
  import { formatConstructionLength, } from './construction-length';
4
+ function openingLevelData(openings, nodes, kind) {
5
+ let drafted;
6
+ return {
7
+ markById: resolveOpeningMarks(openings, nodes, kind).markById,
8
+ draftingMarkById: () => {
9
+ drafted ??= resolveOpeningMarks(openings, nodes, kind, undefined, true).markById;
10
+ return drafted;
11
+ },
12
+ };
13
+ }
3
14
  export function computeDoorFloorplanLevelData(args) {
4
- return resolveOpeningMarks(args.siblings, args.nodes, 'door');
15
+ return openingLevelData(args.siblings, args.nodes, 'door');
5
16
  }
6
17
  export function computeWindowFloorplanLevelData(args) {
7
- return resolveOpeningMarks(args.siblings, args.nodes, 'window');
18
+ return openingLevelData(args.siblings, args.nodes, 'window');
8
19
  }
9
20
  export function buildDoorFloorplanSchedule(args) {
10
21
  if (args.siblings.length === 0)
11
22
  return null;
12
- const marks = resolveOpeningMarks(args.siblings, args.nodes, 'door', args.levelId);
23
+ const marks = resolveOpeningMarks(args.siblings, args.nodes, 'door', args.levelId, args.drafting === true);
13
24
  return {
14
25
  id: 'doors',
15
26
  title: 'DOOR SCHEDULE',
@@ -40,7 +51,7 @@ export function buildDoorFloorplanSchedule(args) {
40
51
  export function buildWindowFloorplanSchedule(args) {
41
52
  if (args.siblings.length === 0)
42
53
  return null;
43
- const marks = resolveOpeningMarks(args.siblings, args.nodes, 'window', args.levelId);
54
+ const marks = resolveOpeningMarks(args.siblings, args.nodes, 'window', args.levelId, args.drafting === true);
44
55
  return {
45
56
  id: 'windows',
46
57
  title: 'WINDOW SCHEDULE',
@@ -60,15 +71,42 @@ export function buildWindowFloorplanSchedule(args) {
60
71
  type: window.openingKind === 'opening' ? 'Opening' : titleCase(window.windowType),
61
72
  size: formatSize(window.width, window.height, args.unit, args.profile ?? 'document'),
62
73
  roughOpening: formatRoughOpening(window, args.unit, args.profile ?? 'document'),
63
- sill: formatConstructionLength(Math.max(0, window.position[1] - window.height / 2), args.unit, args.profile ?? 'document'),
64
- head: formatConstructionLength(window.position[1] + window.height / 2, args.unit, args.profile ?? 'document'),
74
+ sill: formatConstructionLength(Math.max(0, window.position[1] - window.height / 2 + openingDatumOffset(window, args.nodes)), args.unit, args.profile ?? 'document'),
75
+ head: formatConstructionLength(window.position[1] + window.height / 2 + openingDatumOffset(window, args.nodes), args.unit, args.profile ?? 'document'),
65
76
  operation: windowOperation(window),
66
77
  },
67
78
  })),
68
79
  issues: marks.issues,
69
80
  };
70
81
  }
71
- export function buildOpeningMarkAnnotation(opening, wall, levelData, { preferredSide = -1, stroke = '#334155', } = {}) {
82
+ /**
83
+ * TAG SIZE — sized for the paper, not for the screen.
84
+ *
85
+ * These annotations are emitted in WORLD METRES and printed at the sheet's
86
+ * drawing scale, so a size only means something once you name the scale it is
87
+ * read at. The reference is a 1/4" = 1'-0" plan (scale 48, i.e. 48 world
88
+ * inches per paper inch), which is what a residential floor plan is drawn at,
89
+ * and the targets are the ones a permit sheet uses:
90
+ *
91
+ * tag height 0.28 in of paper → 0.28 × 48 / 39.3701 = 0.341 m
92
+ * tag stroke 0.02 in of paper → 0.024 m
93
+ * mark text 0.11 in of paper → 0.134 m, bold
94
+ *
95
+ * The previous values (0.32 m tall, 0.02 m stroke, 0.15 m text) drew a tag
96
+ * that was slightly short with a hairline outline — 0.016 in of paper, under
97
+ * half the intended weight — and text that overflowed it.
98
+ */
99
+ const TAG_REFERENCE_SCALE = 48;
100
+ const INCHES_PER_METRE = 39.37007874015748;
101
+ /** Paper inches → world metres at the reference scale. */
102
+ const paperInches = (inches) => (inches * TAG_REFERENCE_SCALE) / INCHES_PER_METRE;
103
+ export const OPENING_TAG_HEIGHT = paperInches(0.3);
104
+ export const OPENING_TAG_STROKE_WIDTH = paperInches(0.028);
105
+ export const OPENING_TAG_FONT_SIZE = paperInches(0.125);
106
+ export const OPENING_TAG_LEADER_WIDTH = paperInches(0.012);
107
+ /** Clear distance from the wall face to the near edge of the tag. */
108
+ export const OPENING_TAG_STANDOFF = paperInches(0.16);
109
+ export function buildOpeningMarkAnnotation(opening, wall, levelData, { preferredSide = -1, stroke = '#334155', drafting = false, } = {}) {
72
110
  const dx = wall.end[0] - wall.start[0];
73
111
  const dz = wall.end[1] - wall.start[1];
74
112
  const wallLength = Math.hypot(dx, dz);
@@ -78,57 +116,120 @@ export function buildOpeningMarkAnnotation(opening, wall, levelData, { preferred
78
116
  const dirZ = dz / wallLength;
79
117
  const normalX = -dirZ;
80
118
  const normalZ = dirX;
81
- const side = interiorSide(wall, preferredSide);
82
119
  const openingCenterX = wall.start[0] + dirX * opening.position[0];
83
120
  const openingCenterZ = wall.start[1] + dirZ * opening.position[0];
84
- const halfDepth = (wall.thickness ?? 0.1) / 2;
85
- const bubbleOffset = halfDepth + 0.5;
121
+ const explicitMark = opening.mark?.trim();
122
+ const marks = drafting ? levelData?.draftingMarkById() : levelData?.markById;
123
+ const mark = marks?.get(opening.id) ?? (explicitMark || fallbackMark(opening));
124
+ if (!drafting) {
125
+ const side = interiorSide(wall, preferredSide);
126
+ // Distance from the reference line to that face: a justified wall's
127
+ // faces are not symmetric about it.
128
+ const halfDepth = getWallLocalFaceZ(wall, side > 0 ? 'a' : 'b') * side;
129
+ const bubbleOffset = halfDepth + 0.5;
130
+ const bubbleX = openingCenterX + normalX * bubbleOffset * side;
131
+ const bubbleZ = openingCenterZ + normalZ * bubbleOffset * side;
132
+ const bubbleWidth = Math.max(0.38, mark.length * 0.105 + 0.18);
133
+ const bubbleHeight = 0.32;
134
+ const leaderEndOffset = bubbleOffset - bubbleHeight / 2;
135
+ return withFloorplanGeometryMetadata({
136
+ kind: 'group',
137
+ children: [
138
+ {
139
+ kind: 'line',
140
+ x1: openingCenterX + normalX * halfDepth * side,
141
+ y1: openingCenterZ + normalZ * halfDepth * side,
142
+ x2: openingCenterX + normalX * leaderEndOffset * side,
143
+ y2: openingCenterZ + normalZ * leaderEndOffset * side,
144
+ stroke,
145
+ strokeWidth: 0.018,
146
+ },
147
+ {
148
+ kind: 'rect',
149
+ x: bubbleX - bubbleWidth / 2,
150
+ y: bubbleZ - bubbleHeight / 2,
151
+ width: bubbleWidth,
152
+ height: bubbleHeight,
153
+ rx: bubbleHeight / 2,
154
+ ry: bubbleHeight / 2,
155
+ fill: '#ffffff',
156
+ stroke,
157
+ strokeWidth: 0.02,
158
+ },
159
+ {
160
+ kind: 'text',
161
+ x: bubbleX,
162
+ y: bubbleZ,
163
+ text: mark,
164
+ fontSize: 0.15,
165
+ fill: stroke,
166
+ fontWeight: 700,
167
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
168
+ textAnchor: 'middle',
169
+ dominantBaseline: 'middle',
170
+ upright: true,
171
+ },
172
+ ],
173
+ }, { annotationRole: 'opening-mark' });
174
+ }
175
+ // A sheet sets the tag just OUTSIDE the wall on the exterior side, the way
176
+ // a door/window tag is drawn on a construction document. `preferredSide` is
177
+ // the fallback when neither face is declared exterior.
178
+ const side = exteriorSide(wall, preferredSide);
179
+ const halfDepth = getWallLocalFaceZ(wall, side > 0 ? 'a' : 'b') * side;
180
+ const bubbleHeight = OPENING_TAG_HEIGHT;
181
+ // Monospace bold sets at roughly 0.62 em; the tag keeps 0.9 of its own
182
+ // height as end padding so a four-character mark never touches the outline.
183
+ const bubbleWidth = Math.max(bubbleHeight * 1.25, mark.length * OPENING_TAG_FONT_SIZE * 0.62 + bubbleHeight * 0.9);
184
+ // The tag sits just OUTSIDE the wall face on the exterior side.
185
+ const bubbleOffset = halfDepth + OPENING_TAG_STANDOFF + bubbleHeight / 2;
86
186
  const bubbleX = openingCenterX + normalX * bubbleOffset * side;
87
187
  const bubbleZ = openingCenterZ + normalZ * bubbleOffset * side;
88
- const explicitMark = opening.mark?.trim();
89
- const mark = levelData?.markById.get(opening.id) ?? (explicitMark || fallbackMark(opening));
90
- const bubbleWidth = Math.max(0.38, mark.length * 0.105 + 0.18);
91
- const bubbleHeight = 0.32;
92
188
  const leaderEndOffset = bubbleOffset - bubbleHeight / 2;
93
- return withFloorplanGeometryMetadata({
94
- kind: 'group',
95
- children: [
96
- {
97
- kind: 'line',
98
- x1: openingCenterX + normalX * halfDepth * side,
99
- y1: openingCenterZ + normalZ * halfDepth * side,
100
- x2: openingCenterX + normalX * leaderEndOffset * side,
101
- y2: openingCenterZ + normalZ * leaderEndOffset * side,
102
- stroke,
103
- strokeWidth: 0.018,
104
- },
105
- {
106
- kind: 'rect',
107
- x: bubbleX - bubbleWidth / 2,
108
- y: bubbleZ - bubbleHeight / 2,
109
- width: bubbleWidth,
110
- height: bubbleHeight,
111
- rx: bubbleHeight / 2,
112
- ry: bubbleHeight / 2,
113
- fill: '#ffffff',
114
- stroke,
115
- strokeWidth: 0.02,
116
- },
117
- {
118
- kind: 'text',
119
- x: bubbleX,
120
- y: bubbleZ,
121
- text: mark,
122
- fontSize: 0.15,
123
- fill: stroke,
124
- fontWeight: 700,
125
- fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
126
- textAnchor: 'middle',
127
- dominantBaseline: 'middle',
128
- upright: true,
129
- },
130
- ],
131
- }, { annotationRole: 'opening-mark' });
189
+ const children = [];
190
+ // A leader only where there is actually a gap to bridge; a leader drawn
191
+ // under a tag that already touches the wall is just a smudge.
192
+ if (leaderEndOffset - halfDepth > OPENING_TAG_STROKE_WIDTH) {
193
+ children.push({
194
+ kind: 'line',
195
+ x1: openingCenterX + normalX * halfDepth * side,
196
+ y1: openingCenterZ + normalZ * halfDepth * side,
197
+ x2: openingCenterX + normalX * leaderEndOffset * side,
198
+ y2: openingCenterZ + normalZ * leaderEndOffset * side,
199
+ stroke,
200
+ strokeWidth: OPENING_TAG_LEADER_WIDTH,
201
+ });
202
+ }
203
+ // Door tag = hexagon, window tag = ellipse (WS3).
204
+ children.push(opening.type === 'door'
205
+ ? {
206
+ kind: 'polygon',
207
+ points: hexagonPoints(bubbleX, bubbleZ, bubbleWidth, bubbleHeight),
208
+ fill: '#ffffff',
209
+ stroke,
210
+ strokeWidth: OPENING_TAG_STROKE_WIDTH,
211
+ }
212
+ : {
213
+ kind: 'polygon',
214
+ points: ellipsePoints(bubbleX, bubbleZ, bubbleWidth / 2, bubbleHeight / 2),
215
+ fill: '#ffffff',
216
+ stroke,
217
+ strokeWidth: OPENING_TAG_STROKE_WIDTH,
218
+ });
219
+ children.push({
220
+ kind: 'text',
221
+ x: bubbleX,
222
+ y: bubbleZ,
223
+ text: mark,
224
+ fontSize: OPENING_TAG_FONT_SIZE,
225
+ fill: stroke,
226
+ fontWeight: 700,
227
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
228
+ textAnchor: 'middle',
229
+ dominantBaseline: 'middle',
230
+ upright: true,
231
+ });
232
+ return withFloorplanGeometryMetadata({ kind: 'group', children }, { annotationRole: 'opening-mark' });
132
233
  }
133
234
  export function resolveOpeningDimensionDocumentation(opening) {
134
235
  const constructionType = opening.constructionType ?? 'framed';
@@ -148,7 +249,43 @@ export function resolveOpeningDimensionDocumentation(opening) {
148
249
  verified: requestedReference === 'nominal' || dimensions.width !== null,
149
250
  };
150
251
  }
151
- function resolveOpeningMarks(openings, nodes, kind, explicitLevelId) {
252
+ /**
253
+ * The editor plan numbers doors 101, 102… and windows W01, W02… in sibling
254
+ * order. A drafted sheet numbers through `resolveMarkDetail` in the editor
255
+ * package — D101/W101 per level ordinal, clockwise from the NW-most exterior
256
+ * wall. When no level can be resolved (a detached opening in a preview
257
+ * context) both fall back to a local sequence so previews still label
258
+ * something.
259
+ */
260
+ function resolveOpeningMarks(openings, nodes, kind, explicitLevelId, drafting = false) {
261
+ const level = resolveLevel(openings[0], nodes, explicitLevelId);
262
+ const markFor = drafting ? sheetMark : automaticMark;
263
+ if (drafting && level) {
264
+ // Callers pass live sibling snapshots that may not be the objects in
265
+ // `nodes` (mid-drag overrides, un-committed panel edits). Overlay them so
266
+ // an explicit `mark` on the snapshot is honoured.
267
+ const overlaid = { ...nodes };
268
+ for (const opening of openings)
269
+ overlaid[opening.id] = opening;
270
+ const resolution = resolveMarkDetail(overlaid, level.id);
271
+ const markById = new Map();
272
+ for (const opening of openings) {
273
+ const mark = resolution.marks.get(opening.id);
274
+ if (mark)
275
+ markById.set(opening.id, mark);
276
+ }
277
+ const issues = resolution.issues.filter((issue) => issue.startsWith(`Duplicate ${kind} `));
278
+ // Openings the level walk did not reach (detached / hidden) still need
279
+ // a mark so the schedule row is not blank.
280
+ let fallbackSequence = 1;
281
+ for (const opening of openings) {
282
+ if (markById.has(opening.id))
283
+ continue;
284
+ const explicit = opening.mark?.trim();
285
+ markById.set(opening.id, explicit || sheetMark(kind, level.level ?? 0, fallbackSequence++));
286
+ }
287
+ return { markById, issues };
288
+ }
152
289
  const markById = new Map();
153
290
  const explicitMarks = new Map();
154
291
  const used = new Set();
@@ -165,15 +302,14 @@ function resolveOpeningMarks(openings, nodes, kind, explicitLevelId) {
165
302
  else
166
303
  explicitMarks.set(normalized, [opening.id]);
167
304
  }
168
- const level = resolveLevel(openings[0], nodes, explicitLevelId);
169
305
  let sequence = 1;
170
306
  for (const opening of openings) {
171
307
  if (markById.has(opening.id))
172
308
  continue;
173
- let candidate = automaticMark(kind, level?.level ?? 0, sequence);
309
+ let candidate = markFor(kind, level?.level ?? 0, sequence);
174
310
  while (used.has(candidate.toLocaleUpperCase())) {
175
311
  sequence++;
176
- candidate = automaticMark(kind, level?.level ?? 0, sequence);
312
+ candidate = markFor(kind, level?.level ?? 0, sequence);
177
313
  }
178
314
  markById.set(opening.id, candidate);
179
315
  used.add(candidate.toLocaleUpperCase());
@@ -196,13 +332,17 @@ function resolveLevel(opening, nodes, explicitLevelId) {
196
332
  if (current?.type === 'level')
197
333
  return current;
198
334
  }
199
- return undefined;
335
+ return;
200
336
  }
201
337
  function automaticMark(kind, level, sequence) {
202
338
  if (kind === 'door')
203
339
  return String((Math.max(0, level) + 1) * 100 + sequence);
204
340
  return `W${String(sequence).padStart(2, '0')}`;
205
341
  }
342
+ function sheetMark(kind, level, sequence) {
343
+ const base = (Math.max(0, level) + 1) * 100;
344
+ return `${kind === 'door' ? 'D' : 'W'}${base + sequence}`;
345
+ }
206
346
  function fallbackMark(opening) {
207
347
  return opening.type === 'door' ? 'D?' : 'W?';
208
348
  }
@@ -213,6 +353,46 @@ function interiorSide(wall, fallback) {
213
353
  return 1;
214
354
  return fallback;
215
355
  }
356
+ /** The face that looks outdoors — where the opening tag is drawn. */
357
+ function exteriorSide(wall, fallback) {
358
+ if (wall.frontSide === 'exterior' && wall.backSide !== 'exterior')
359
+ return 1;
360
+ if (wall.backSide === 'exterior' && wall.frontSide !== 'exterior')
361
+ return -1;
362
+ return fallback;
363
+ }
364
+ /**
365
+ * Window tag outline. The geometry union has no `ellipse` primitive
366
+ * (`packages/core/src/registry/types.ts:364+`), so the ellipse is emitted as
367
+ * a 24-gon — indistinguishable at tag size in both SVG and the vector PDF,
368
+ * and it needs no change to the renderers.
369
+ */
370
+ function ellipsePoints(cx, cy, rx, ry) {
371
+ const segments = 24;
372
+ const points = [];
373
+ for (let index = 0; index < segments; index++) {
374
+ const angle = (index / segments) * Math.PI * 2;
375
+ points.push([cx + Math.cos(angle) * rx, cy + Math.sin(angle) * ry]);
376
+ }
377
+ return points;
378
+ }
379
+ /**
380
+ * A flat-top hexagon inscribed in the tag box: the standard door-tag
381
+ * outline. `width` is the full span, `height` the full depth.
382
+ */
383
+ function hexagonPoints(cx, cy, width, height) {
384
+ const halfWidth = width / 2;
385
+ const halfHeight = height / 2;
386
+ const inset = Math.min(halfWidth * 0.42, halfHeight);
387
+ return [
388
+ [cx - halfWidth, cy],
389
+ [cx - halfWidth + inset, cy - halfHeight],
390
+ [cx + halfWidth - inset, cy - halfHeight],
391
+ [cx + halfWidth, cy],
392
+ [cx + halfWidth - inset, cy + halfHeight],
393
+ [cx - halfWidth + inset, cy + halfHeight],
394
+ ];
395
+ }
216
396
  function formatSize(width, height, unit, profile) {
217
397
  return `${formatConstructionLength(width, unit, profile)} x ${formatConstructionLength(height, unit, profile)}`;
218
398
  }
@@ -298,3 +478,9 @@ function titleCase(value) {
298
478
  .map((part) => part.charAt(0).toLocaleUpperCase() + part.slice(1))
299
479
  .join(' ');
300
480
  }
481
+ function openingDatumOffset(opening, nodes) {
482
+ const wall = nodes[opening.parentId ?? ''];
483
+ return wall?.type === 'wall'
484
+ ? getOpeningFloorDatum(wall, opening, nodes) - wallSupportForNodes(wall, nodes).elevation
485
+ : 0;
486
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,WAAW,EAIhB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAUzB;;qFAEqF;AACrF,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjE,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAgBf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,MAAM,GAAG,IAAI,CAchB;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,IAAI,CA2EP;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAiBD;yEACyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAYnD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,EACD,eAAe,EAAE,OAAO,GACvB,IAAI,CAeN"}
1
+ {"version":3,"file":"opening-guides-runtime.d.ts","sourceRoot":"","sources":["../../src/shared/opening-guides-runtime.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,OAAO,EAOZ,KAAK,WAAW,EAGhB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAUzB;;qFAEqF;AACrF,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAEjE,sEAAsE;AACtE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,WAAW,EAAE,CAmBf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,MAAM,GAAG,IAAI,CAoBhB;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,IAAI,CAmFP;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAcD;yEACyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAKnD;AAED;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,IAAI,EAAE,QAAQ,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,IAAI,CAQP;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf,EACD,eAAe,EAAE,OAAO,GACvB,IAAI,CAeN"}
@@ -2,7 +2,7 @@
2
2
  // editor's 3D guide store, used by the door/window move + placement tools. Lives
3
3
  // in `nodes` (not core) because it talks to the editor store; kept thin so each
4
4
  // tool's per-tick hook is a single call.
5
- import { computeOpeningGuides, detectVerticalAlignment, sceneRegistry, spatialGridManager, useScene, } from '@pascal-app/core';
5
+ import { computeOpeningGuides, detectVerticalAlignment, getOpeningFloorDatum, getWallCurveFrameAt, getWallCurveLength, sceneRegistry, useScene, wallSupportForNodes, } from '@pascal-app/core';
6
6
  import { useOpeningGuides } from '@pascal-app/editor';
7
7
  import { resolveWallOpeningCeiling } from './wall-opening-ceiling';
8
8
  // Parity with `snapLocalXToNeighbors`' along-wall threshold.
@@ -24,7 +24,9 @@ export function collectOpeningSiblings(wall, movingId, nodes) {
24
24
  id: node.id,
25
25
  centerS: node.position[0],
26
26
  width: node.width,
27
- centerY: node.position[1],
27
+ centerY: node.position[1] +
28
+ getOpeningFloorDatum(wall, node, nodes) -
29
+ wallSupportForNodes(wall, nodes).elevation,
28
30
  height: node.height,
29
31
  });
30
32
  }
@@ -38,19 +40,23 @@ export function collectOpeningSiblings(wall, movingId, nodes) {
38
40
  */
39
41
  export function resolveSillSnap(args) {
40
42
  const siblings = collectOpeningSiblings(args.wall, args.movingId, args.nodes);
43
+ const datumOffset = getOpeningFloorDatum(args.wall, { position: [args.localX, args.localY, 0], width: args.width, height: args.height }, args.nodes) - wallSupportForNodes(args.wall, args.nodes).elevation;
41
44
  const match = detectVerticalAlignment({
42
45
  id: args.movingId,
43
46
  centerS: args.localX,
44
47
  width: args.width,
45
- centerY: args.localY,
48
+ centerY: args.localY + datumOffset,
46
49
  height: args.height,
47
50
  }, siblings, SILL_SNAP_THRESHOLD_M);
48
51
  return match ? args.localY + match.snap : null;
49
52
  }
50
53
  /** Compute and publish the 3D opening guides for the current drag tick. */
51
54
  export function publishOpeningGuides3D(args) {
52
- const { wall, centerS, centerY, width, toWorld } = args;
53
- const wallLength = Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
55
+ const { wall, centerS, width, toWorld } = args;
56
+ const centerY = args.centerY +
57
+ getOpeningFloorDatum(wall, { position: [centerS, args.centerY, 0], width, height: args.height }, args.nodes) -
58
+ wallSupportForNodes(wall, args.nodes).elevation;
59
+ const wallLength = getWallCurveLength(wall);
54
60
  const wallHeight = resolveWallOpeningCeiling(wall, args.nodes);
55
61
  const siblings = collectOpeningSiblings(wall, args.movingId, args.nodes);
56
62
  const guides = computeOpeningGuides({
@@ -126,21 +132,18 @@ export function clearOpeningGuides3D() {
126
132
  * publisher (which already has them) and the resize publisher (which derives
127
133
  * them from the scene). Same frame as `wallLocalToWorld`. */
128
134
  function makeWallToWorld(wall, levelYOffset, slabElevation) {
129
- const angle = Math.atan2(wall.end[1] - wall.start[1], wall.end[0] - wall.start[0]);
130
- const cos = Math.cos(angle);
131
- const sin = Math.sin(angle);
132
- return (s, y) => [
133
- wall.start[0] + s * cos,
134
- slabElevation + y + levelYOffset,
135
- wall.start[1] + s * sin,
136
- ];
135
+ const length = getWallCurveLength(wall);
136
+ return (s, y) => {
137
+ const { point } = getWallCurveFrameAt(wall, s / length);
138
+ return [point.x, slabElevation + y + levelYOffset, point.y];
139
+ };
137
140
  }
138
141
  /** Like {@link makeWallToWorld} but derives the level Y + slab elevation from the
139
142
  * scene, for callers without a wall event — i.e. the resize handles. */
140
143
  export function wallToWorld(wall) {
141
144
  const levelId = wall.parentId;
142
145
  const levelYOffset = levelId ? (sceneRegistry.nodes.get(levelId)?.position.y ?? 0) : 0;
143
- const slabElevation = spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end, wall.curveOffset ?? 0, wall.thickness, wall.supportSlabId);
146
+ const slabElevation = wallSupportForNodes(wall, useScene.getState().nodes).elevation;
144
147
  return makeWallToWorld(wall, levelYOffset, slabElevation);
145
148
  }
146
149
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAKpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CA4GrB"}
1
+ {"version":3,"file":"opening-placement-dimensions.d.ts","sourceRoot":"","sources":["../../src/shared/opening-placement-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAMpB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAKzB;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CA6GrB"}
@@ -1,4 +1,4 @@
1
- import { computeOpeningGuides, isCurvedWall, useScene, } from '@pascal-app/core';
1
+ import { computeOpeningGuides, getWallFaceOffsets, isCurvedWall, useScene, } from '@pascal-app/core';
2
2
  import { readFloorplanContext } from '@pascal-app/editor';
3
3
  import { formatConstructionLength } from './construction-length';
4
4
  import { resolveWallOpeningCeiling } from './wall-opening-ceiling';
@@ -38,8 +38,8 @@ export function buildOpeningPlacementDimensions(opening, ctx) {
38
38
  // land on the same face. Walk wall's siblings (the level's other
39
39
  // walls) via ctx.resolve to compute the centroid.
40
40
  const outwardNormal = computeOutwardNormal(wall, ctx, dirX, dirZ);
41
- const wallThickness = wall.thickness ?? 0.1;
42
- const halfThickness = wallThickness / 2;
41
+ const offsets = getWallFaceOffsets(wall);
42
+ const halfThickness = outwardNormal[0] * -dirZ + outwardNormal[1] * dirX >= 0 ? offsets.a : -offsets.b;
43
43
  const FLOORPLAN_WALL_OUTER_MEASUREMENT_OFFSET = 0.32;
44
44
  // Outer-face projection for the placement dimensions (so extension lines stay
45
45
  // short and the layout matches the legacy treatment); centreline projection
@@ -0,0 +1,23 @@
1
+ import type { DoorNode, WindowNode } from '@pascal-app/core';
2
+ type PlanarOpening = Pick<DoorNode | WindowNode, 'position' | 'wallId' | 'parentId'>;
3
+ /**
4
+ * The wall-local plane offset (`position[2]`) a moved door / window keeps on
5
+ * `targetWallId`. The offset is measured from the centre plane of the wall the
6
+ * opening stands on (a photo-profiled slider can sit wholly outside one face),
7
+ * so it survives a slide along that same wall and resets to the centre plane on
8
+ * any other host, whose faces it says nothing about.
9
+ */
10
+ export declare function openingPlaneOffsetOnWall(opening: PlanarOpening, targetWallId: string): number;
11
+ /**
12
+ * Where an opening's plan symbol sits across its wall. A centred opening keeps
13
+ * the long-standing symbol: centred in the cutout, as deep as the wall. An
14
+ * opening offset from the centre plane draws its frame at that offset with its
15
+ * own `frameDepth`, like the 3D renderer; the builder then also draws the
16
+ * cutout, because the wall is still cut through its whole thickness.
17
+ */
18
+ export declare function resolveOpeningPlanPlane(opening: Pick<DoorNode | WindowNode, 'position' | 'frameDepth'>, wallThickness: number): {
19
+ offset: number;
20
+ depth: number;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=opening-plane-offset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-plane-offset.d.ts","sourceRoot":"","sources":["../../src/shared/opening-plane-offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE5D,KAAK,aAAa,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;AAEpF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,IAAI,CAAC,QAAQ,GAAG,UAAU,EAAE,UAAU,GAAG,YAAY,CAAC,EAC/D,aAAa,EAAE,MAAM,GACpB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAInC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The wall-local plane offset (`position[2]`) a moved door / window keeps on
3
+ * `targetWallId`. The offset is measured from the centre plane of the wall the
4
+ * opening stands on (a photo-profiled slider can sit wholly outside one face),
5
+ * so it survives a slide along that same wall and resets to the centre plane on
6
+ * any other host, whose faces it says nothing about.
7
+ */
8
+ export function openingPlaneOffsetOnWall(opening, targetWallId) {
9
+ const hostWallId = opening.wallId ?? opening.parentId;
10
+ return hostWallId === targetWallId ? (opening.position[2] ?? 0) : 0;
11
+ }
12
+ /**
13
+ * Where an opening's plan symbol sits across its wall. A centred opening keeps
14
+ * the long-standing symbol: centred in the cutout, as deep as the wall. An
15
+ * opening offset from the centre plane draws its frame at that offset with its
16
+ * own `frameDepth`, like the 3D renderer; the builder then also draws the
17
+ * cutout, because the wall is still cut through its whole thickness.
18
+ */
19
+ export function resolveOpeningPlanPlane(opening, wallThickness) {
20
+ const offset = opening.position[2] ?? 0;
21
+ if (offset === 0 || !(opening.frameDepth > 0))
22
+ return { offset: 0, depth: wallThickness };
23
+ return { offset, depth: opening.frameDepth };
24
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-centroid-move.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-centroid-move.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,0BAA0B,EAMhC,MAAM,kBAAkB,CAAA;AAqDzB,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAChC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACjC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C,GAAG,0BAA0B,CAiF7B"}
1
+ {"version":3,"file":"polygon-centroid-move.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-centroid-move.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAEd,KAAK,0BAA0B,EAMhC,MAAM,kBAAkB,CAAA;AAqDzB,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAChC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACjC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C,GAAG,0BAA0B,CAoF7B"}
@@ -108,7 +108,10 @@ export function createPolygonCentroidMoveTarget(args) {
108
108
  if (extraCommitData) {
109
109
  Object.assign(data, extraCommitData);
110
110
  }
111
- useScene.getState().updateNodes([{ id, data }]);
111
+ // Dragging the shape by hand is the sanctioned conversion of a derived
112
+ // slab or ceiling into an authored one; for every other kind this is an
113
+ // ordinary polygon update carrying `extraCommitData`.
114
+ useScene.getState().detachDerivedNode(id, data);
112
115
  useScene.getState().markDirty(id);
113
116
  useLiveTransforms.getState().clear(id);
114
117
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"polygon-vertex-affordance.d.ts","sourceRoot":"","sources":["../../src/shared/polygon-vertex-affordance.ts"],"names":[],"mappings":"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"}