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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +34 -0
  2. package/dist/building/definition.js +1 -1
  3. package/dist/cabinet/definition.d.ts.map +1 -1
  4. package/dist/cabinet/definition.js +809 -72
  5. package/dist/cabinet/geometry.d.ts.map +1 -1
  6. package/dist/cabinet/geometry.js +4 -0
  7. package/dist/cabinet/move-frame.js +3 -3
  8. package/dist/cabinet/panel.d.ts.map +1 -1
  9. package/dist/cabinet/panel.js +1 -0
  10. package/dist/cabinet/placement-snap.d.ts +8 -0
  11. package/dist/cabinet/placement-snap.d.ts.map +1 -0
  12. package/dist/cabinet/placement-snap.js +19 -0
  13. package/dist/cabinet/presets.js +8 -8
  14. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  15. package/dist/cabinet/quick-actions.js +9 -3
  16. package/dist/cabinet/resize-limits.d.ts +11 -0
  17. package/dist/cabinet/resize-limits.d.ts.map +1 -0
  18. package/dist/cabinet/resize-limits.js +22 -0
  19. package/dist/cabinet/run-layout.d.ts +8 -2
  20. package/dist/cabinet/run-layout.d.ts.map +1 -1
  21. package/dist/cabinet/run-layout.js +59 -7
  22. package/dist/cabinet/run-ops.d.ts +44 -3
  23. package/dist/cabinet/run-ops.d.ts.map +1 -1
  24. package/dist/cabinet/run-ops.js +646 -110
  25. package/dist/cabinet/run-panel.d.ts +2 -1
  26. package/dist/cabinet/run-panel.d.ts.map +1 -1
  27. package/dist/cabinet/run-panel.js +38 -4
  28. package/dist/cabinet/stack-transitions.js +4 -4
  29. package/dist/cabinet/tool.d.ts.map +1 -1
  30. package/dist/cabinet/tool.js +95 -17
  31. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  32. package/dist/cabinet/wall-snap.js +2 -6
  33. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  34. package/dist/ceiling/boundary-editor.js +2 -2
  35. package/dist/ceiling/definition.d.ts +1 -1
  36. package/dist/ceiling/definition.d.ts.map +1 -1
  37. package/dist/ceiling/definition.js +36 -5
  38. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  39. package/dist/ceiling/floorplan-move.d.ts +4 -4
  40. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  41. package/dist/ceiling/floorplan-move.js +5 -4
  42. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  43. package/dist/ceiling/hole-editor.js +2 -2
  44. package/dist/ceiling/move-tool.d.ts.map +1 -1
  45. package/dist/ceiling/move-tool.js +4 -3
  46. package/dist/ceiling/panel.d.ts.map +1 -1
  47. package/dist/ceiling/panel.js +65 -3
  48. package/dist/ceiling/renderer.d.ts.map +1 -1
  49. package/dist/ceiling/renderer.js +6 -2
  50. package/dist/ceiling/tool.d.ts.map +1 -1
  51. package/dist/ceiling/tool.js +12 -1
  52. package/dist/chimney/definition.d.ts.map +1 -1
  53. package/dist/chimney/definition.js +1 -0
  54. package/dist/chimney/tool.d.ts.map +1 -1
  55. package/dist/chimney/tool.js +16 -1
  56. package/dist/column/definition.d.ts.map +1 -1
  57. package/dist/column/definition.js +14 -2
  58. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  59. package/dist/column/floorplan-affordances.js +19 -14
  60. package/dist/column/floorplan-move.d.ts.map +1 -1
  61. package/dist/column/floorplan-move.js +7 -2
  62. package/dist/column/floorplan.d.ts +9 -1
  63. package/dist/column/floorplan.d.ts.map +1 -1
  64. package/dist/column/floorplan.js +59 -4
  65. package/dist/column/tool.d.ts.map +1 -1
  66. package/dist/column/tool.js +33 -7
  67. package/dist/construction-dimension/definition.d.ts +4 -0
  68. package/dist/construction-dimension/definition.d.ts.map +1 -0
  69. package/dist/construction-dimension/definition.js +83 -0
  70. package/dist/construction-dimension/drawing-coordination.d.ts +7 -0
  71. package/dist/construction-dimension/drawing-coordination.d.ts.map +1 -0
  72. package/dist/construction-dimension/drawing-coordination.js +54 -0
  73. package/dist/construction-dimension/floorplan-affordances.d.ts +4 -0
  74. package/dist/construction-dimension/floorplan-affordances.d.ts.map +1 -0
  75. package/dist/construction-dimension/floorplan-affordances.js +114 -0
  76. package/dist/construction-dimension/floorplan-tool.d.ts +21 -0
  77. package/dist/construction-dimension/floorplan-tool.d.ts.map +1 -0
  78. package/dist/construction-dimension/floorplan-tool.js +557 -0
  79. package/dist/construction-dimension/floorplan.d.ts +3 -0
  80. package/dist/construction-dimension/floorplan.d.ts.map +1 -0
  81. package/dist/construction-dimension/floorplan.js +457 -0
  82. package/dist/construction-dimension/geometry.d.ts +31 -0
  83. package/dist/construction-dimension/geometry.d.ts.map +1 -0
  84. package/dist/construction-dimension/geometry.js +144 -0
  85. package/dist/construction-dimension/index.d.ts +4 -0
  86. package/dist/construction-dimension/index.d.ts.map +1 -0
  87. package/dist/construction-dimension/index.js +3 -0
  88. package/dist/construction-dimension/panel.d.ts +2 -0
  89. package/dist/construction-dimension/panel.d.ts.map +1 -0
  90. package/dist/construction-dimension/panel.js +128 -0
  91. package/dist/construction-dimension/parametrics.d.ts +3 -0
  92. package/dist/construction-dimension/parametrics.d.ts.map +1 -0
  93. package/dist/construction-dimension/parametrics.js +4 -0
  94. package/dist/construction-dimension/schema.d.ts +2 -0
  95. package/dist/construction-dimension/schema.d.ts.map +1 -0
  96. package/dist/construction-dimension/schema.js +1 -0
  97. package/dist/door/contextual-dimensions.d.ts +3 -0
  98. package/dist/door/contextual-dimensions.d.ts.map +1 -0
  99. package/dist/door/contextual-dimensions.js +7 -0
  100. package/dist/door/definition.d.ts.map +1 -1
  101. package/dist/door/definition.js +13 -8
  102. package/dist/door/floorplan-affordances.d.ts +2 -5
  103. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  104. package/dist/door/floorplan-affordances.js +9 -18
  105. package/dist/door/floorplan.d.ts +3 -4
  106. package/dist/door/floorplan.d.ts.map +1 -1
  107. package/dist/door/floorplan.js +88 -6
  108. package/dist/door/move-tool.d.ts.map +1 -1
  109. package/dist/door/move-tool.js +2 -2
  110. package/dist/door/panel.d.ts.map +1 -1
  111. package/dist/door/panel.js +3 -1
  112. package/dist/door/schema.d.ts +1 -1
  113. package/dist/door/schema.d.ts.map +1 -1
  114. package/dist/door/schema.js +1 -1
  115. package/dist/door/tool.d.ts.map +1 -1
  116. package/dist/door/tool.js +63 -6
  117. package/dist/dormer/definition.d.ts.map +1 -1
  118. package/dist/dormer/definition.js +1 -0
  119. package/dist/dormer/tool.d.ts.map +1 -1
  120. package/dist/dormer/tool.js +23 -1
  121. package/dist/duct-segment/tool.d.ts.map +1 -1
  122. package/dist/duct-segment/tool.js +20 -9
  123. package/dist/duct-terminal/tool.d.ts.map +1 -1
  124. package/dist/duct-terminal/tool.js +9 -6
  125. package/dist/elevator/floorplan-affordances.d.ts +2 -6
  126. package/dist/elevator/floorplan-affordances.d.ts.map +1 -1
  127. package/dist/elevator/floorplan-affordances.js +13 -12
  128. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  129. package/dist/fence/actions/move-endpoint.js +29 -1
  130. package/dist/fence/definition.d.ts.map +1 -1
  131. package/dist/fence/definition.js +74 -14
  132. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  133. package/dist/fence/floorplan-affordances.js +48 -11
  134. package/dist/fence/floorplan-move.d.ts.map +1 -1
  135. package/dist/fence/floorplan-move.js +38 -3
  136. package/dist/fence/geometry.d.ts.map +1 -1
  137. package/dist/fence/geometry.js +15 -1
  138. package/dist/fence/lift.d.ts +38 -0
  139. package/dist/fence/lift.d.ts.map +1 -0
  140. package/dist/fence/lift.js +51 -0
  141. package/dist/fence/move-tool.d.ts.map +1 -1
  142. package/dist/fence/move-tool.js +25 -5
  143. package/dist/fence/system.d.ts +3 -0
  144. package/dist/fence/system.d.ts.map +1 -0
  145. package/dist/fence/system.js +46 -0
  146. package/dist/fence/tool.d.ts.map +1 -1
  147. package/dist/fence/tool.js +103 -32
  148. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  149. package/dist/hvac-equipment/tool.js +8 -3
  150. package/dist/index.d.ts +2 -0
  151. package/dist/index.d.ts.map +1 -1
  152. package/dist/index.js +6 -0
  153. package/dist/item/definition.d.ts.map +1 -1
  154. package/dist/item/definition.js +7 -1
  155. package/dist/item/floorplan-move.d.ts.map +1 -1
  156. package/dist/item/floorplan-move.js +50 -43
  157. package/dist/item/floorplan.d.ts +1 -0
  158. package/dist/item/floorplan.d.ts.map +1 -1
  159. package/dist/item/floorplan.js +49 -0
  160. package/dist/item/renderer.d.ts +3 -0
  161. package/dist/item/renderer.d.ts.map +1 -1
  162. package/dist/item/renderer.js +96 -8
  163. package/dist/level/definition.d.ts.map +1 -1
  164. package/dist/level/definition.js +7 -3
  165. package/dist/lineset/tool.d.ts.map +1 -1
  166. package/dist/lineset/tool.js +5 -1
  167. package/dist/liquid-line/tool.d.ts.map +1 -1
  168. package/dist/liquid-line/tool.js +7 -1
  169. package/dist/measurement/definition.d.ts.map +1 -1
  170. package/dist/measurement/definition.js +5 -0
  171. package/dist/measurement/floorplan.d.ts.map +1 -1
  172. package/dist/measurement/floorplan.js +11 -10
  173. package/dist/measurement/index.d.ts +1 -1
  174. package/dist/measurement/index.d.ts.map +1 -1
  175. package/dist/measurement/index.js +1 -1
  176. package/dist/measurement/resolve.d.ts +5 -0
  177. package/dist/measurement/resolve.d.ts.map +1 -1
  178. package/dist/measurement/resolve.js +2 -2
  179. package/dist/measurement/surface-query.js +5 -5
  180. package/dist/measurement/tool.d.ts +6 -1
  181. package/dist/measurement/tool.d.ts.map +1 -1
  182. package/dist/measurement/tool.js +7 -11
  183. package/dist/pipe-segment/tool.d.ts.map +1 -1
  184. package/dist/pipe-segment/tool.js +22 -19
  185. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  186. package/dist/roof-segment/floorplan-affordances.js +14 -8
  187. package/dist/shared/construction-dimension-standards.d.ts +34 -0
  188. package/dist/shared/construction-dimension-standards.d.ts.map +1 -0
  189. package/dist/shared/construction-dimension-standards.js +18 -0
  190. package/dist/shared/construction-length.d.ts +10 -0
  191. package/dist/shared/construction-length.d.ts.map +1 -0
  192. package/dist/shared/construction-length.js +57 -0
  193. package/dist/shared/dimension-string.d.ts +20 -0
  194. package/dist/shared/dimension-string.d.ts.map +1 -0
  195. package/dist/shared/dimension-string.js +19 -0
  196. package/dist/shared/draft-axis-guides.d.ts +36 -0
  197. package/dist/shared/draft-axis-guides.d.ts.map +1 -0
  198. package/dist/shared/draft-axis-guides.js +107 -0
  199. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  200. package/dist/shared/move-roof-tool.js +17 -3
  201. package/dist/shared/opening-documentation-fields.d.ts +16 -0
  202. package/dist/shared/opening-documentation-fields.d.ts.map +1 -0
  203. package/dist/shared/opening-documentation-fields.js +54 -0
  204. package/dist/shared/opening-documentation.d.ts +47 -0
  205. package/dist/shared/opening-documentation.d.ts.map +1 -0
  206. package/dist/shared/opening-documentation.js +300 -0
  207. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  208. package/dist/shared/opening-guides-runtime.js +3 -2
  209. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  210. package/dist/shared/opening-placement-dimensions.js +14 -5
  211. package/dist/shared/wall-opening-ceiling.d.ts +30 -0
  212. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -0
  213. package/dist/shared/wall-opening-ceiling.js +29 -0
  214. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  215. package/dist/shelf/floorplan-affordances.js +10 -5
  216. package/dist/shelf/floorplan-move.d.ts +2 -16
  217. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  218. package/dist/shelf/floorplan-move.js +19 -40
  219. package/dist/shelf/tool.d.ts.map +1 -1
  220. package/dist/shelf/tool.js +8 -3
  221. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  222. package/dist/site/recessed-slab-ground-holes.js +1 -4
  223. package/dist/site/renderer.d.ts.map +1 -1
  224. package/dist/site/renderer.js +118 -28
  225. package/dist/site/terrain-drape.d.ts +91 -0
  226. package/dist/site/terrain-drape.d.ts.map +1 -0
  227. package/dist/site/terrain-drape.js +205 -0
  228. package/dist/site/terrain-geometry.d.ts +131 -0
  229. package/dist/site/terrain-geometry.d.ts.map +1 -0
  230. package/dist/site/terrain-geometry.js +259 -0
  231. package/dist/site/terrain-mesh.d.ts +49 -0
  232. package/dist/site/terrain-mesh.d.ts.map +1 -0
  233. package/dist/site/terrain-mesh.js +122 -0
  234. package/dist/site/terrain-renderer.d.ts +28 -0
  235. package/dist/site/terrain-renderer.d.ts.map +1 -0
  236. package/dist/site/terrain-renderer.js +69 -0
  237. package/dist/skylight/definition.d.ts.map +1 -1
  238. package/dist/skylight/definition.js +1 -0
  239. package/dist/skylight/tool.d.ts.map +1 -1
  240. package/dist/skylight/tool.js +16 -1
  241. package/dist/slab/definition.d.ts.map +1 -1
  242. package/dist/slab/definition.js +87 -10
  243. package/dist/slab/elevation-limit.d.ts +43 -0
  244. package/dist/slab/elevation-limit.d.ts.map +1 -0
  245. package/dist/slab/elevation-limit.js +124 -0
  246. package/dist/slab/floorplan-affordances.d.ts +16 -0
  247. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  248. package/dist/slab/geometry.d.ts.map +1 -1
  249. package/dist/slab/geometry.js +98 -5
  250. package/dist/slab/panel.d.ts.map +1 -1
  251. package/dist/slab/panel.js +82 -4
  252. package/dist/slab/parametrics.d.ts +1 -1
  253. package/dist/slab/parametrics.d.ts.map +1 -1
  254. package/dist/slab/parametrics.js +13 -1
  255. package/dist/slab/placement-ownership.d.ts +3 -0
  256. package/dist/slab/placement-ownership.d.ts.map +1 -0
  257. package/dist/slab/placement-ownership.js +3 -0
  258. package/dist/slab/quick-measurement.d.ts.map +1 -1
  259. package/dist/slab/quick-measurement.js +3 -2
  260. package/dist/slab/system.d.ts.map +1 -1
  261. package/dist/slab/system.js +14 -4
  262. package/dist/slab/tool.d.ts.map +1 -1
  263. package/dist/slab/tool.js +81 -23
  264. package/dist/solar-panel/definition.d.ts.map +1 -1
  265. package/dist/solar-panel/definition.js +1 -0
  266. package/dist/solar-panel/tool.d.ts.map +1 -1
  267. package/dist/solar-panel/tool.js +17 -1
  268. package/dist/spawn/definition.d.ts.map +1 -1
  269. package/dist/spawn/definition.js +1 -0
  270. package/dist/spawn/floorplan-affordances.d.ts.map +1 -1
  271. package/dist/spawn/floorplan-affordances.js +7 -4
  272. package/dist/spawn/floorplan-move.d.ts.map +1 -1
  273. package/dist/spawn/floorplan-move.js +8 -6
  274. package/dist/spawn/renderer.d.ts +4 -0
  275. package/dist/spawn/renderer.d.ts.map +1 -1
  276. package/dist/spawn/renderer.js +32 -18
  277. package/dist/spawn/tool.d.ts +2 -2
  278. package/dist/spawn/tool.d.ts.map +1 -1
  279. package/dist/spawn/tool.js +78 -11
  280. package/dist/stair/definition.d.ts.map +1 -1
  281. package/dist/stair/definition.js +15 -7
  282. package/dist/stair/destination.d.ts +16 -0
  283. package/dist/stair/destination.d.ts.map +1 -0
  284. package/dist/stair/destination.js +24 -0
  285. package/dist/stair/documentation.d.ts +8 -0
  286. package/dist/stair/documentation.d.ts.map +1 -0
  287. package/dist/stair/documentation.js +245 -0
  288. package/dist/stair/floor-stack.d.ts.map +1 -1
  289. package/dist/stair/floor-stack.js +38 -0
  290. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  291. package/dist/stair/floorplan-affordances.js +28 -9
  292. package/dist/stair/floorplan-move.d.ts +3 -5
  293. package/dist/stair/floorplan-move.d.ts.map +1 -1
  294. package/dist/stair/floorplan-move.js +14 -16
  295. package/dist/stair/floorplan.d.ts.map +1 -1
  296. package/dist/stair/floorplan.js +27 -14
  297. package/dist/stair/panel.d.ts.map +1 -1
  298. package/dist/stair/panel.js +35 -2
  299. package/dist/stair/renderer.d.ts.map +1 -1
  300. package/dist/stair/renderer.js +4 -3
  301. package/dist/structural-grid/coordination.d.ts +16 -0
  302. package/dist/structural-grid/coordination.d.ts.map +1 -0
  303. package/dist/structural-grid/coordination.js +105 -0
  304. package/dist/structural-grid/definition.d.ts +4 -0
  305. package/dist/structural-grid/definition.d.ts.map +1 -0
  306. package/dist/structural-grid/definition.js +51 -0
  307. package/dist/structural-grid/floorplan-tool.d.ts +16 -0
  308. package/dist/structural-grid/floorplan-tool.d.ts.map +1 -0
  309. package/dist/structural-grid/floorplan-tool.js +183 -0
  310. package/dist/structural-grid/floorplan.d.ts +3 -0
  311. package/dist/structural-grid/floorplan.d.ts.map +1 -0
  312. package/dist/structural-grid/floorplan.js +61 -0
  313. package/dist/structural-grid/index.d.ts +2 -0
  314. package/dist/structural-grid/index.d.ts.map +1 -0
  315. package/dist/structural-grid/index.js +1 -0
  316. package/dist/structural-grid/schema.d.ts +2 -0
  317. package/dist/structural-grid/schema.d.ts.map +1 -0
  318. package/dist/structural-grid/schema.js +1 -0
  319. package/dist/wall/construction-dimensions.d.ts +32 -0
  320. package/dist/wall/construction-dimensions.d.ts.map +1 -0
  321. package/dist/wall/construction-dimensions.js +1031 -0
  322. package/dist/wall/contextual-dimensions.d.ts +13 -0
  323. package/dist/wall/contextual-dimensions.d.ts.map +1 -0
  324. package/dist/wall/contextual-dimensions.js +221 -0
  325. package/dist/wall/definition.d.ts.map +1 -1
  326. package/dist/wall/definition.js +20 -1
  327. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  328. package/dist/wall/floorplan-affordances.js +23 -8
  329. package/dist/wall/floorplan-overrides.d.ts +9 -6
  330. package/dist/wall/floorplan-overrides.d.ts.map +1 -1
  331. package/dist/wall/floorplan-overrides.js +20 -11
  332. package/dist/wall/floorplan.d.ts +12 -3
  333. package/dist/wall/floorplan.d.ts.map +1 -1
  334. package/dist/wall/floorplan.js +121 -79
  335. package/dist/wall/measurement.d.ts.map +1 -1
  336. package/dist/wall/measurement.js +17 -4
  337. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  338. package/dist/wall/move-endpoint-tool.js +74 -27
  339. package/dist/wall/move-shared.d.ts.map +1 -1
  340. package/dist/wall/move-shared.js +3 -2
  341. package/dist/wall/move-tool.d.ts.map +1 -1
  342. package/dist/wall/move-tool.js +15 -3
  343. package/dist/wall/paint.d.ts.map +1 -1
  344. package/dist/wall/paint.js +10 -6
  345. package/dist/wall/panel.d.ts.map +1 -1
  346. package/dist/wall/panel.js +32 -5
  347. package/dist/wall/parametrics.d.ts.map +1 -1
  348. package/dist/wall/parametrics.js +2 -0
  349. package/dist/wall/preview.d.ts +8 -0
  350. package/dist/wall/preview.d.ts.map +1 -0
  351. package/dist/wall/preview.js +39 -0
  352. package/dist/wall/quick-measurement.d.ts.map +1 -1
  353. package/dist/wall/quick-measurement.js +3 -2
  354. package/dist/wall/renderer.d.ts.map +1 -1
  355. package/dist/wall/renderer.js +7 -5
  356. package/dist/wall/system.d.ts +1 -1
  357. package/dist/wall/system.d.ts.map +1 -1
  358. package/dist/wall/system.js +37 -2
  359. package/dist/wall/tool.d.ts.map +1 -1
  360. package/dist/wall/tool.js +148 -96
  361. package/dist/wall/treatment-level-data.d.ts +14 -0
  362. package/dist/wall/treatment-level-data.d.ts.map +1 -0
  363. package/dist/wall/treatment-level-data.js +31 -0
  364. package/dist/wall/treatments.d.ts +8 -2
  365. package/dist/wall/treatments.d.ts.map +1 -1
  366. package/dist/wall/treatments.js +58 -15
  367. package/dist/window/contextual-dimensions.d.ts +3 -0
  368. package/dist/window/contextual-dimensions.d.ts.map +1 -0
  369. package/dist/window/contextual-dimensions.js +7 -0
  370. package/dist/window/definition.d.ts.map +1 -1
  371. package/dist/window/definition.js +15 -10
  372. package/dist/window/floorplan-affordances.d.ts +2 -5
  373. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  374. package/dist/window/floorplan-affordances.js +9 -15
  375. package/dist/window/floorplan-move.d.ts.map +1 -1
  376. package/dist/window/floorplan-move.js +1 -1
  377. package/dist/window/floorplan.d.ts.map +1 -1
  378. package/dist/window/floorplan.js +7 -1
  379. package/dist/window/move-tool.d.ts.map +1 -1
  380. package/dist/window/move-tool.js +3 -3
  381. package/dist/window/panel.d.ts.map +1 -1
  382. package/dist/window/panel.js +4 -1
  383. package/dist/window/schema.d.ts +1 -1
  384. package/dist/window/schema.d.ts.map +1 -1
  385. package/dist/window/schema.js +1 -1
  386. package/dist/window/tool.d.ts.map +1 -1
  387. package/dist/window/tool.js +64 -7
  388. package/dist/window/window-math.d.ts +7 -3
  389. package/dist/window/window-math.d.ts.map +1 -1
  390. package/dist/window/window-math.js +8 -3
  391. package/dist/zone/contextual-dimensions.d.ts +3 -0
  392. package/dist/zone/contextual-dimensions.d.ts.map +1 -0
  393. package/dist/zone/contextual-dimensions.js +43 -0
  394. package/dist/zone/definition.d.ts.map +1 -1
  395. package/dist/zone/definition.js +9 -1
  396. package/dist/zone/floorplan-affordances.d.ts +36 -0
  397. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  398. package/dist/zone/floorplan.d.ts.map +1 -1
  399. package/dist/zone/floorplan.js +59 -3
  400. package/dist/zone/quantities-panel.d.ts.map +1 -1
  401. package/dist/zone/quantities-panel.js +48 -4
  402. package/dist/zone/room-clear-dimensions.d.ts +3 -0
  403. package/dist/zone/room-clear-dimensions.d.ts.map +1 -0
  404. package/dist/zone/room-clear-dimensions.js +406 -0
  405. package/dist/zone/room-documentation.d.ts +11 -0
  406. package/dist/zone/room-documentation.d.ts.map +1 -0
  407. package/dist/zone/room-documentation.js +97 -0
  408. package/package.json +7 -7
@@ -0,0 +1,557 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ConstructionDimensionNode, closestMeasurementFeatureBinding, constructionDimensionRequiredAnchorCount, getWallArcData, getWallCurveFrameAt, nodeRegistry, } from '@pascal-app/core';
4
+ import { buildSvgArcPath, clearSurfacePlanSnapFeedback, FloorplanGeometryRenderer, formatLinearMeasurement, getArcPlanPoint, isGridSnapActive, isMagneticSnapActive, markToolCancelConsumed, resolveSurfacePlanPointSnap, triggerSFX, useDrawingView, useFloorplanRender, useInteractionScope, } from '@pascal-app/editor';
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
+ import { alignConstructionDimensionDirectionToSharedWall, resolveCircularConstructionDimensionLayout, } from './geometry';
7
+ const SEMANTIC_SNAP_DISTANCE = 0.2;
8
+ const SEMANTIC_BYPASS_DISTANCE = 0.012;
9
+ const MIN_DIMENSION_LENGTH = 0.001;
10
+ const MIN_ARC_SWEEP = 1e-6;
11
+ const emptyDraft = () => ({ anchors: [], points: [], stage: 'witnesses' });
12
+ function geometryContext(node, nodes) {
13
+ const resolve = (id) => nodes[id];
14
+ const childIds = 'children' in node && Array.isArray(node.children) ? node.children : [];
15
+ const children = childIds
16
+ .map((id) => nodes[id])
17
+ .filter((child) => child !== undefined);
18
+ const parent = node.parentId ? (nodes[node.parentId] ?? null) : null;
19
+ const siblings = parent && 'children' in parent && Array.isArray(parent.children)
20
+ ? parent.children
21
+ .map((id) => nodes[id])
22
+ .filter((sibling) => sibling !== undefined && sibling.type === node.type)
23
+ : [];
24
+ return { resolve, children, parent, siblings };
25
+ }
26
+ function associatePoint(point, targetNodeId, maxDistance, nodes) {
27
+ if (!targetNodeId)
28
+ return { anchor: point, point, semantic: false, targetNodeId: null };
29
+ const node = nodes[targetNodeId];
30
+ const contribution = node ? nodeRegistry.get(node.type)?.measurement : undefined;
31
+ if (!(node && contribution))
32
+ return { anchor: point, point, semantic: false, targetNodeId };
33
+ const context = geometryContext(node, nodes);
34
+ const features = contribution.features(node, context);
35
+ const match = contribution.match?.(node, context, point, maxDistance) ??
36
+ closestMeasurementFeatureBinding(features, point, maxDistance);
37
+ if (!match)
38
+ return { anchor: point, point, semantic: false, targetNodeId };
39
+ const reference = {
40
+ nodeId: node.id,
41
+ featureId: match.featureId,
42
+ parameters: match.parameters,
43
+ };
44
+ const anchor = {
45
+ kind: 'feature',
46
+ reference,
47
+ fallback: match.point,
48
+ };
49
+ return { anchor, point: match.point, semantic: true, targetNodeId };
50
+ }
51
+ function clientToPlanPoint(group, clientX, clientY) {
52
+ const matrix = group.getScreenCTM();
53
+ if (!matrix)
54
+ return null;
55
+ const local = new DOMPoint(clientX, clientY).matrixTransform(matrix.inverse());
56
+ return [local.x, 0, local.y];
57
+ }
58
+ function registryTargetNodeId(target) {
59
+ if (!(target instanceof Element))
60
+ return null;
61
+ return (target.closest('.floorplan-registry-entry[data-node-id]')?.dataset.nodeId ?? null);
62
+ }
63
+ export function resolveConstructionDimensionDraftDirection(points, anchors, nodes) {
64
+ if (points.length < 2)
65
+ return null;
66
+ const dx = points[1][0] - points[0][0];
67
+ const dz = points[1][2] - points[0][2];
68
+ const magnitude = Math.hypot(dx, dz);
69
+ if (magnitude <= MIN_DIMENSION_LENGTH)
70
+ return null;
71
+ const measuredDirection = [dx / magnitude, dz / magnitude];
72
+ return anchors && nodes
73
+ ? alignConstructionDimensionDirectionToSharedWall(measuredDirection, anchors, (id) => nodes[id])
74
+ : measuredDirection;
75
+ }
76
+ export function buildConstructionDimensionPreviewGeometries(points, baselinePoint, unit, mode = 'linear', metricNotation = 'meters', directionOverride) {
77
+ if (mode === 'arc-length' || mode === 'angular') {
78
+ const layout = resolveCircularConstructionDimensionLayout(mode, points);
79
+ if (!(layout?.end && Math.abs(layout.sweep) > MIN_ARC_SWEEP))
80
+ return [];
81
+ const center = { x: layout.center[0], y: layout.center[1] };
82
+ const end = getArcPlanPoint(center, layout.radius, layout.endAngle);
83
+ const arcMid = getArcPlanPoint(center, layout.radius, layout.startAngle + layout.sweep / 2);
84
+ const stroke = '#06b6d4';
85
+ const lineStyle = {
86
+ fill: 'none',
87
+ pointerEvents: 'none',
88
+ stroke,
89
+ strokeWidth: 2,
90
+ vectorEffect: 'non-scaling-stroke',
91
+ };
92
+ if (mode === 'angular') {
93
+ const endRadius = Math.hypot(layout.end[0] - center.x, layout.end[1] - center.y);
94
+ const maximumRadius = Math.max(0.25, Math.min(layout.radius, endRadius) * 0.9);
95
+ const requestedRadius = Math.hypot(baselinePoint[0] - center.x, baselinePoint[2] - center.y);
96
+ const arcRadius = Math.min(maximumRadius, Math.max(0.25, requestedRadius));
97
+ const midAngle = layout.startAngle + layout.sweep / 2;
98
+ const arcMid = getArcPlanPoint(center, arcRadius, midAngle);
99
+ const startRayEnd = getArcPlanPoint(center, Math.max(layout.radius, arcRadius + 0.12), layout.startAngle);
100
+ const endRayEnd = getArcPlanPoint(center, Math.max(endRadius, arcRadius + 0.12), layout.endAngle);
101
+ const degrees = (Math.abs(layout.sweep) * 180) / Math.PI;
102
+ const formattedDegrees = Number.parseFloat(degrees.toFixed(degrees < 10 ? 1 : 0));
103
+ return [
104
+ {
105
+ kind: 'group',
106
+ children: [
107
+ {
108
+ kind: 'line',
109
+ x1: center.x,
110
+ y1: center.y,
111
+ x2: startRayEnd.x,
112
+ y2: startRayEnd.y,
113
+ ...lineStyle,
114
+ },
115
+ {
116
+ kind: 'line',
117
+ x1: center.x,
118
+ y1: center.y,
119
+ x2: endRayEnd.x,
120
+ y2: endRayEnd.y,
121
+ ...lineStyle,
122
+ },
123
+ {
124
+ kind: 'path',
125
+ d: buildSvgArcPath(center, arcRadius, layout.startAngle, layout.startAngle + layout.sweep),
126
+ ...lineStyle,
127
+ },
128
+ {
129
+ kind: 'line',
130
+ x1: arcMid.x,
131
+ y1: arcMid.y,
132
+ x2: baselinePoint[0],
133
+ y2: baselinePoint[2],
134
+ strokeDasharray: '6 5',
135
+ ...lineStyle,
136
+ },
137
+ {
138
+ kind: 'dimension-label',
139
+ cx: baselinePoint[0],
140
+ cy: baselinePoint[2],
141
+ text: `∠ ${formattedDegrees}°`,
142
+ angle: 0,
143
+ screenUpright: true,
144
+ appearance: 'outlined',
145
+ },
146
+ ],
147
+ },
148
+ ];
149
+ }
150
+ return [
151
+ {
152
+ kind: 'group',
153
+ children: [
154
+ {
155
+ kind: 'path',
156
+ d: buildSvgArcPath(center, layout.radius, layout.startAngle, layout.startAngle + layout.sweep),
157
+ ...lineStyle,
158
+ },
159
+ {
160
+ kind: 'line',
161
+ x1: layout.center[0],
162
+ y1: layout.center[1],
163
+ x2: layout.start[0],
164
+ y2: layout.start[1],
165
+ strokeDasharray: '6 5',
166
+ ...lineStyle,
167
+ },
168
+ {
169
+ kind: 'line',
170
+ x1: layout.center[0],
171
+ y1: layout.center[1],
172
+ x2: end.x,
173
+ y2: end.y,
174
+ strokeDasharray: '6 5',
175
+ ...lineStyle,
176
+ },
177
+ {
178
+ kind: 'line',
179
+ x1: arcMid.x,
180
+ y1: arcMid.y,
181
+ x2: baselinePoint[0],
182
+ y2: baselinePoint[2],
183
+ strokeDasharray: '6 5',
184
+ ...lineStyle,
185
+ },
186
+ {
187
+ kind: 'dimension-label',
188
+ cx: baselinePoint[0],
189
+ cy: baselinePoint[2],
190
+ text: `ARC ${formatLinearMeasurement(layout.arcLength, unit, metricNotation)}`,
191
+ angle: 0,
192
+ screenUpright: true,
193
+ appearance: 'outlined',
194
+ },
195
+ ],
196
+ },
197
+ ];
198
+ }
199
+ if (!['linear', 'chord', 'radius', 'diameter'].includes(mode))
200
+ return [];
201
+ const direction = directionOverride ?? resolveConstructionDimensionDraftDirection(points);
202
+ if (!direction)
203
+ return [];
204
+ const normal = [-direction[1], direction[0]];
205
+ const project = (point) => {
206
+ const along = (point[0] - baselinePoint[0]) * direction[0] + (point[2] - baselinePoint[2]) * direction[1];
207
+ return [baselinePoint[0] + along * direction[0], baselinePoint[2] + along * direction[1]];
208
+ };
209
+ const dimensionPoints = points.map(project);
210
+ return points.slice(0, -1).map((start, index) => {
211
+ const end = points[index + 1];
212
+ const dx = end[0] - start[0];
213
+ const dz = end[2] - start[2];
214
+ const value = Math.abs(dx * direction[0] + dz * direction[1]);
215
+ const rawText = formatLinearMeasurement(mode === 'radius' ? value / 2 : value, unit, metricNotation);
216
+ const text = mode === 'radius'
217
+ ? `R ${rawText}`
218
+ : mode === 'diameter'
219
+ ? `Ø ${rawText}`
220
+ : mode === 'chord'
221
+ ? `CH ${rawText}`
222
+ : rawText;
223
+ return {
224
+ kind: 'dimension',
225
+ start: [start[0], start[2]],
226
+ end: [end[0], end[2]],
227
+ dimensionStart: dimensionPoints[index],
228
+ dimensionEnd: dimensionPoints[index + 1],
229
+ offsetNormal: normal,
230
+ offsetDistance: 0,
231
+ extensionOvershoot: 0.12,
232
+ text,
233
+ stroke: '#06b6d4',
234
+ };
235
+ });
236
+ }
237
+ export function normalizeConstructionDimensionChainMode(value) {
238
+ return value === 'continuous' ? 'continuous' : 'point-to-point';
239
+ }
240
+ export function normalizeConstructionDimensionMode(value) {
241
+ return [
242
+ 'radius',
243
+ 'diameter',
244
+ 'center-mark',
245
+ 'chord',
246
+ 'arc-length',
247
+ 'angular',
248
+ 'coordinate',
249
+ ].includes(value)
250
+ ? value
251
+ : 'linear';
252
+ }
253
+ export function constructionDimensionUsesBaseline(mode) {
254
+ return ['linear', 'chord', 'arc-length', 'angular'].includes(mode);
255
+ }
256
+ export function shouldConsumeConstructionDimensionPointerEvent(event) {
257
+ if (event.type === 'pointerdown')
258
+ return event.button === 0;
259
+ return (event.buttons & 0b110) === 0;
260
+ }
261
+ function wallFeatureAnchor(wall, featureId, fallback) {
262
+ return {
263
+ kind: 'feature',
264
+ reference: { nodeId: wall.id, featureId },
265
+ fallback,
266
+ };
267
+ }
268
+ export function buildCurvedWallConstructionDimensionDraft(wall, mode) {
269
+ const arc = getWallArcData(wall);
270
+ if (!arc)
271
+ return null;
272
+ const center = [arc.center.x, 0, arc.center.y];
273
+ const start = [wall.start[0], 0, wall.start[1]];
274
+ const end = [wall.end[0], 0, wall.end[1]];
275
+ const midpointFrame = getWallCurveFrameAt(wall, 0.5);
276
+ const midpoint = [midpointFrame.point.x, 0, midpointFrame.point.y];
277
+ const feature = (featureId, fallback) => wallFeatureAnchor(wall, featureId, fallback);
278
+ switch (mode) {
279
+ case 'center-mark':
280
+ return {
281
+ anchors: [feature('wall:curve:center', center), feature('wall:midpoint', midpoint)],
282
+ points: [center, midpoint],
283
+ };
284
+ case 'chord':
285
+ return {
286
+ anchors: [feature('wall:start', start), feature('wall:end', end)],
287
+ points: [start, end],
288
+ };
289
+ case 'arc-length':
290
+ case 'angular':
291
+ return null;
292
+ default:
293
+ return null;
294
+ }
295
+ }
296
+ export function FloorplanConstructionDimensionToolLayer({ activeLevelId, finishTool, gridSnapStep, metricNotation, sceneApi, selectNode, toolDefaults, unit, }) {
297
+ const groupRef = useRef(null);
298
+ const draftRef = useRef(emptyDraft());
299
+ const [draft, setDraft] = useState(draftRef.current);
300
+ const [hover, setHover] = useState(null);
301
+ const chainMode = normalizeConstructionDimensionChainMode(toolDefaults?.chainMode);
302
+ const dimensionMode = normalizeConstructionDimensionMode(toolDefaults?.mode);
303
+ const collectsMany = dimensionMode === 'coordinate' || (dimensionMode === 'linear' && chainMode === 'continuous');
304
+ const usesBaseline = constructionDimensionUsesBaseline(dimensionMode);
305
+ const renderContext = useFloorplanRender();
306
+ const drawingType = useDrawingView((state) => state.drawingType);
307
+ useEffect(() => {
308
+ useInteractionScope.getState().begin({ kind: 'drafting', tool: 'construction-dimension' });
309
+ return () => useInteractionScope
310
+ .getState()
311
+ .endIf((scope) => scope.kind === 'drafting' && scope.tool === 'construction-dimension');
312
+ }, []);
313
+ const updateDraft = useCallback((next) => {
314
+ draftRef.current = next;
315
+ setDraft(next);
316
+ }, []);
317
+ useEffect(() => {
318
+ updateDraft(emptyDraft());
319
+ setHover(null);
320
+ const group = groupRef.current;
321
+ const svg = group?.ownerSVGElement;
322
+ if (!(activeLevelId && group && svg))
323
+ return;
324
+ const consume = (event) => {
325
+ event.preventDefault();
326
+ event.stopPropagation();
327
+ event.stopImmediatePropagation();
328
+ };
329
+ const resolveEvent = (event) => {
330
+ const raw = clientToPlanPoint(group, event.clientX, event.clientY);
331
+ if (!raw)
332
+ return null;
333
+ const forceFree = event.altKey;
334
+ const gridStep = !forceFree && isGridSnapActive() ? gridSnapStep : 0;
335
+ const fallbackPoint = gridStep > 0
336
+ ? [Math.round(raw[0] / gridStep) * gridStep, Math.round(raw[2] / gridStep) * gridStep]
337
+ : [raw[0], raw[2]];
338
+ const magnetic = !forceFree && isMagneticSnapActive();
339
+ const surface = resolveSurfacePlanPointSnap({
340
+ rawPoint: [raw[0], raw[2]],
341
+ fallbackPoint,
342
+ levelId: activeLevelId,
343
+ align: false,
344
+ magnetic,
345
+ });
346
+ const point = [surface.point[0], 0, surface.point[1]];
347
+ const targetNodeId = surface.wallIds[0] ?? registryTargetNodeId(event.target);
348
+ return associatePoint(point, targetNodeId, magnetic ? SEMANTIC_SNAP_DISTANCE : SEMANTIC_BYPASS_DISTANCE, sceneApi.nodes());
349
+ };
350
+ const commitDraft = (current, baselinePoint) => {
351
+ const direction = resolveConstructionDimensionDraftDirection(current.points, current.anchors, sceneApi.nodes());
352
+ const originPoint = baselinePoint ?? current.points.at(-1);
353
+ if (!(direction && originPoint))
354
+ return false;
355
+ const node = ConstructionDimensionNode.parse({
356
+ name: dimensionMode === 'linear' && chainMode === 'continuous'
357
+ ? 'Continuous Dimension'
358
+ : `${dimensionMode.replaceAll('-', ' ')} Dimension`,
359
+ anchors: current.anchors,
360
+ baseline: {
361
+ origin: [originPoint[0], originPoint[2]],
362
+ direction,
363
+ },
364
+ chainMode,
365
+ mode: dimensionMode,
366
+ drawingType,
367
+ });
368
+ sceneApi.upsert(node, activeLevelId);
369
+ selectNode(node.id);
370
+ triggerSFX('sfx:structure-build');
371
+ finishTool();
372
+ updateDraft(emptyDraft());
373
+ setHover(null);
374
+ return true;
375
+ };
376
+ const finishWitnesses = () => {
377
+ const current = draftRef.current;
378
+ const required = constructionDimensionRequiredAnchorCount(dimensionMode);
379
+ if (current.stage !== 'witnesses' || current.points.length < required)
380
+ return false;
381
+ if (!usesBaseline)
382
+ return commitDraft(current);
383
+ updateDraft({ ...current, stage: 'baseline' });
384
+ triggerSFX('sfx:grid-snap');
385
+ return true;
386
+ };
387
+ const removeLastWitness = () => {
388
+ const current = draftRef.current;
389
+ if (current.points.length === 0)
390
+ return false;
391
+ updateDraft({
392
+ anchors: current.anchors.slice(0, -1),
393
+ points: current.points.slice(0, -1),
394
+ stage: 'witnesses',
395
+ });
396
+ return true;
397
+ };
398
+ const commitAt = (associated) => {
399
+ const current = draftRef.current;
400
+ if (current.stage === 'baseline')
401
+ commitDraft(current, associated.point);
402
+ };
403
+ const onPointerDown = (event) => {
404
+ if (shouldConsumeConstructionDimensionPointerEvent(event))
405
+ consume(event);
406
+ };
407
+ const onPointerMove = (event) => {
408
+ if (shouldConsumeConstructionDimensionPointerEvent(event))
409
+ consume(event);
410
+ setHover(resolveEvent(event));
411
+ };
412
+ const onPointerLeave = () => {
413
+ clearSurfacePlanSnapFeedback();
414
+ setHover(null);
415
+ };
416
+ const onClick = (event) => {
417
+ if (event.button !== 0)
418
+ return;
419
+ consume(event);
420
+ if (event.detail > 1)
421
+ return;
422
+ const associated = resolveEvent(event);
423
+ if (!associated)
424
+ return;
425
+ const current = draftRef.current;
426
+ if (current.stage === 'baseline') {
427
+ commitAt(associated);
428
+ return;
429
+ }
430
+ const targetNode = associated.targetNodeId
431
+ ? sceneApi.get(associated.targetNodeId)
432
+ : undefined;
433
+ const curvedWallDraft = current.points.length === 0 && targetNode?.type === 'wall'
434
+ ? buildCurvedWallConstructionDimensionDraft(targetNode, dimensionMode)
435
+ : null;
436
+ if (curvedWallDraft) {
437
+ const next = { ...curvedWallDraft, stage: 'witnesses' };
438
+ updateDraft(next);
439
+ triggerSFX('sfx:grid-snap');
440
+ if (usesBaseline)
441
+ updateDraft({ ...next, stage: 'baseline' });
442
+ else
443
+ commitDraft(next);
444
+ return;
445
+ }
446
+ const previous = current.points.at(-1);
447
+ if (previous &&
448
+ Math.hypot(associated.point[0] - previous[0], associated.point[2] - previous[2]) <=
449
+ MIN_DIMENSION_LENGTH) {
450
+ return;
451
+ }
452
+ const next = {
453
+ anchors: [...current.anchors, associated.anchor],
454
+ points: [...current.points, associated.point],
455
+ stage: 'witnesses',
456
+ };
457
+ updateDraft(next);
458
+ triggerSFX('sfx:grid-snap');
459
+ if (!collectsMany &&
460
+ next.points.length === constructionDimensionRequiredAnchorCount(dimensionMode)) {
461
+ if (usesBaseline)
462
+ updateDraft({ ...next, stage: 'baseline' });
463
+ else
464
+ commitDraft(next);
465
+ }
466
+ };
467
+ const onDoubleClick = (event) => {
468
+ if (event.button !== 0 || !collectsMany)
469
+ return;
470
+ consume(event);
471
+ finishWitnesses();
472
+ };
473
+ const onKeyDown = (event) => {
474
+ if (event.key === 'Enter' && collectsMany) {
475
+ if (!finishWitnesses())
476
+ return;
477
+ event.preventDefault();
478
+ event.stopImmediatePropagation();
479
+ return;
480
+ }
481
+ if (event.key === 'Backspace') {
482
+ if (!removeLastWitness())
483
+ return;
484
+ event.preventDefault();
485
+ event.stopImmediatePropagation();
486
+ markToolCancelConsumed();
487
+ return;
488
+ }
489
+ if (event.key !== 'Escape')
490
+ return;
491
+ event.preventDefault();
492
+ event.stopImmediatePropagation();
493
+ markToolCancelConsumed();
494
+ const current = draftRef.current;
495
+ if (current.stage === 'baseline') {
496
+ updateDraft({ ...current, stage: 'witnesses' });
497
+ return;
498
+ }
499
+ if (removeLastWitness())
500
+ return;
501
+ finishTool();
502
+ };
503
+ const onBlur = () => clearSurfacePlanSnapFeedback();
504
+ svg.addEventListener('pointerdown', onPointerDown, true);
505
+ svg.addEventListener('pointermove', onPointerMove, true);
506
+ svg.addEventListener('pointerleave', onPointerLeave, true);
507
+ svg.addEventListener('click', onClick, true);
508
+ svg.addEventListener('dblclick', onDoubleClick, true);
509
+ window.addEventListener('keydown', onKeyDown, true);
510
+ window.addEventListener('blur', onBlur);
511
+ return () => {
512
+ clearSurfacePlanSnapFeedback();
513
+ svg.removeEventListener('pointerdown', onPointerDown, true);
514
+ svg.removeEventListener('pointermove', onPointerMove, true);
515
+ svg.removeEventListener('pointerleave', onPointerLeave, true);
516
+ svg.removeEventListener('click', onClick, true);
517
+ svg.removeEventListener('dblclick', onDoubleClick, true);
518
+ window.removeEventListener('keydown', onKeyDown, true);
519
+ window.removeEventListener('blur', onBlur);
520
+ };
521
+ }, [
522
+ activeLevelId,
523
+ chainMode,
524
+ collectsMany,
525
+ dimensionMode,
526
+ drawingType,
527
+ finishTool,
528
+ gridSnapStep,
529
+ sceneApi,
530
+ selectNode,
531
+ updateDraft,
532
+ usesBaseline,
533
+ ]);
534
+ const preview = useMemo(() => {
535
+ if (draft.stage !== 'baseline' || !hover)
536
+ return [];
537
+ const direction = resolveConstructionDimensionDraftDirection(draft.points, draft.anchors, sceneApi.nodes());
538
+ return buildConstructionDimensionPreviewGeometries(draft.points, hover.point, unit, dimensionMode, metricNotation, direction);
539
+ }, [
540
+ dimensionMode,
541
+ draft.anchors,
542
+ draft.points,
543
+ draft.stage,
544
+ hover,
545
+ metricNotation,
546
+ sceneApi,
547
+ unit,
548
+ ]);
549
+ const witnessDraftPoints = draft.stage === 'witnesses' && hover ? [...draft.points, hover.point] : draft.points;
550
+ if (!activeLevelId)
551
+ return null;
552
+ const unitsPerPixel = renderContext?.unitsPerPixel ?? 0.01;
553
+ const reticleRadius = 10 * unitsPerPixel;
554
+ const hoverColor = hover?.semantic ? '#22c55e' : '#06b6d4';
555
+ return (_jsxs("g", { ref: groupRef, children: [witnessDraftPoints.length >= 2 && (draft.stage === 'witnesses' || preview.length === 0) ? (_jsx("polyline", { fill: "none", pointerEvents: "none", points: witnessDraftPoints.map((point) => `${point[0]},${point[2]}`).join(' '), stroke: "#06b6d4", strokeDasharray: "6 5", strokeWidth: 2, vectorEffect: "non-scaling-stroke" })) : null, preview.map((geometry, index) => (_jsx(FloorplanGeometryRenderer, { annotationUnitsPerPoint: unitsPerPixel, geometry: geometry, sceneRotationDeg: renderContext?.sceneRotationDeg ?? 0 }, `${index}-${geometry.kind}`))), draft.points.map((point, index) => (_jsx("circle", { fill: "#06b6d4", pointerEvents: "none", r: 4.5 * unitsPerPixel, stroke: "#ffffff", strokeWidth: 1.5, vectorEffect: "non-scaling-stroke", cx: point[0], cy: point[2] }, `${index}-${point.join('-')}`))), hover ? (_jsxs("g", { pointerEvents: "none", children: [_jsx("circle", { cx: hover.point[0], cy: hover.point[2], fill: "none", r: reticleRadius, stroke: hoverColor, strokeWidth: 2, vectorEffect: "non-scaling-stroke" }), _jsx("line", { stroke: hoverColor, strokeWidth: 1.5, vectorEffect: "non-scaling-stroke", x1: hover.point[0] - reticleRadius * 1.4, x2: hover.point[0] + reticleRadius * 1.4, y1: hover.point[2], y2: hover.point[2] }), _jsx("line", { stroke: hoverColor, strokeWidth: 1.5, vectorEffect: "non-scaling-stroke", x1: hover.point[0], x2: hover.point[0], y1: hover.point[2] - reticleRadius * 1.4, y2: hover.point[2] + reticleRadius * 1.4 })] })) : null] }));
556
+ }
557
+ export default FloorplanConstructionDimensionToolLayer;
@@ -0,0 +1,3 @@
1
+ import type { ConstructionDimensionNode, FloorplanGeometry, GeometryContext } from '@pascal-app/core';
2
+ export declare function buildConstructionDimensionFloorplan(node: ConstructionDimensionNode, ctx: GeometryContext): FloorplanGeometry | null;
3
+ //# sourceMappingURL=floorplan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/construction-dimension/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,yBAAyB,EACzB,iBAAiB,EAGjB,eAAe,EAIhB,MAAM,kBAAkB,CAAA;AA6BzB,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,yBAAyB,EAC/B,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAiF1B"}