@pascal-app/core 0.9.1 → 0.9.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 (321) hide show
  1. package/dist/events/bus.d.ts +30 -2
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  6. package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
  7. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  8. package/dist/hooks/scene-registry/scene-registry.js +27 -1
  9. package/dist/hooks/scene-registry/scene-registry.test.d.ts +2 -0
  10. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +1 -0
  11. package/dist/hooks/scene-registry/scene-registry.test.js +26 -0
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +93 -0
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +69 -12
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +476 -195
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.js +19 -1
  18. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +2 -0
  19. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +1 -0
  20. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +363 -0
  21. package/dist/index.d.ts +16 -6
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +15 -5
  24. package/dist/lib/level-name.d.ts +4 -0
  25. package/dist/lib/level-name.d.ts.map +1 -0
  26. package/dist/lib/level-name.js +10 -0
  27. package/dist/lib/measurement-geometry.d.ts +19 -0
  28. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  29. package/dist/lib/measurement-geometry.js +232 -0
  30. package/dist/lib/measurement-geometry.test.d.ts +2 -0
  31. package/dist/lib/measurement-geometry.test.d.ts.map +1 -0
  32. package/dist/lib/measurement-geometry.test.js +102 -0
  33. package/dist/lib/polygon-geometry.d.ts +0 -1
  34. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  35. package/dist/lib/polygon-geometry.js +0 -18
  36. package/dist/lib/selection-proxy.d.ts +4 -0
  37. package/dist/lib/selection-proxy.d.ts.map +1 -0
  38. package/dist/lib/selection-proxy.js +12 -0
  39. package/dist/lib/slab-polygon.d.ts +31 -2
  40. package/dist/lib/slab-polygon.d.ts.map +1 -1
  41. package/dist/lib/slab-polygon.js +525 -31
  42. package/dist/lib/slab-polygon.test.d.ts +2 -0
  43. package/dist/lib/slab-polygon.test.d.ts.map +1 -0
  44. package/dist/lib/slab-polygon.test.js +635 -0
  45. package/dist/lib/slots.d.ts +14 -0
  46. package/dist/lib/slots.d.ts.map +1 -0
  47. package/dist/lib/slots.js +26 -0
  48. package/dist/lib/space-detection.d.ts +25 -2
  49. package/dist/lib/space-detection.d.ts.map +1 -1
  50. package/dist/lib/space-detection.js +414 -118
  51. package/dist/lib/space-detection.test.js +301 -2
  52. package/dist/lib/wall-distance.d.ts +60 -0
  53. package/dist/lib/wall-distance.d.ts.map +1 -0
  54. package/dist/lib/wall-distance.js +85 -0
  55. package/dist/lib/zone-quantities.d.ts +21 -0
  56. package/dist/lib/zone-quantities.d.ts.map +1 -0
  57. package/dist/lib/zone-quantities.js +183 -0
  58. package/dist/lib/zone-quantities.test.d.ts +2 -0
  59. package/dist/lib/zone-quantities.test.d.ts.map +1 -0
  60. package/dist/lib/zone-quantities.test.js +82 -0
  61. package/dist/material-library.d.ts +20 -1
  62. package/dist/material-library.d.ts.map +1 -1
  63. package/dist/material-library.js +2181 -441
  64. package/dist/registry/handles.d.ts +75 -2
  65. package/dist/registry/handles.d.ts.map +1 -1
  66. package/dist/registry/index.d.ts +3 -3
  67. package/dist/registry/index.d.ts.map +1 -1
  68. package/dist/registry/index.js +1 -1
  69. package/dist/registry/registry.d.ts +46 -3
  70. package/dist/registry/registry.d.ts.map +1 -1
  71. package/dist/registry/registry.js +82 -1
  72. package/dist/registry/registry.test.js +14 -1
  73. package/dist/registry/subtree.d.ts.map +1 -1
  74. package/dist/registry/subtree.js +4 -0
  75. package/dist/registry/subtree.test.js +30 -0
  76. package/dist/registry/types.d.ts +717 -38
  77. package/dist/registry/types.d.ts.map +1 -1
  78. package/dist/schema/index.d.ts +21 -5
  79. package/dist/schema/index.d.ts.map +1 -1
  80. package/dist/schema/index.js +17 -3
  81. package/dist/schema/material.d.ts +3 -2
  82. package/dist/schema/material.d.ts.map +1 -1
  83. package/dist/schema/material.js +7 -5
  84. package/dist/schema/material.test.d.ts +2 -0
  85. package/dist/schema/material.test.d.ts.map +1 -0
  86. package/dist/schema/material.test.js +43 -0
  87. package/dist/schema/nodes/box-vent.d.ts +2 -2
  88. package/dist/schema/nodes/cabinet.d.ts +534 -0
  89. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  90. package/dist/schema/nodes/cabinet.js +137 -0
  91. package/dist/schema/nodes/ceiling.d.ts +3 -2
  92. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  93. package/dist/schema/nodes/ceiling.js +4 -0
  94. package/dist/schema/nodes/chimney.d.ts +4 -4
  95. package/dist/schema/nodes/column.d.ts +3 -2
  96. package/dist/schema/nodes/column.d.ts.map +1 -1
  97. package/dist/schema/nodes/column.js +3 -0
  98. package/dist/schema/nodes/cupola.d.ts +2 -2
  99. package/dist/schema/nodes/door.d.ts +13 -5
  100. package/dist/schema/nodes/door.d.ts.map +1 -1
  101. package/dist/schema/nodes/door.js +12 -0
  102. package/dist/schema/nodes/dormer.d.ts +8 -8
  103. package/dist/schema/nodes/dormer.js +1 -1
  104. package/dist/schema/nodes/downspout.d.ts +2 -2
  105. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  106. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  107. package/dist/schema/nodes/duct-fitting.js +92 -0
  108. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  109. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  110. package/dist/schema/nodes/duct-segment.js +73 -0
  111. package/dist/schema/nodes/duct-terminal.d.ts +57 -0
  112. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  113. package/dist/schema/nodes/duct-terminal.js +51 -0
  114. package/dist/schema/nodes/elevator.d.ts +3 -2
  115. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  116. package/dist/schema/nodes/elevator.js +3 -0
  117. package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
  118. package/dist/schema/nodes/fence.d.ts +18 -2
  119. package/dist/schema/nodes/fence.d.ts.map +1 -1
  120. package/dist/schema/nodes/fence.js +25 -2
  121. package/dist/schema/nodes/gutter.d.ts +2 -2
  122. package/dist/schema/nodes/hvac-equipment.d.ts +63 -0
  123. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  124. package/dist/schema/nodes/hvac-equipment.js +55 -0
  125. package/dist/schema/nodes/item.d.ts +8 -0
  126. package/dist/schema/nodes/item.d.ts.map +1 -1
  127. package/dist/schema/nodes/item.js +11 -0
  128. package/dist/schema/nodes/level.d.ts +1 -1
  129. package/dist/schema/nodes/level.d.ts.map +1 -1
  130. package/dist/schema/nodes/level.js +2 -0
  131. package/dist/schema/nodes/lineset.d.ts +42 -0
  132. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  133. package/dist/schema/nodes/lineset.js +38 -0
  134. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  135. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  136. package/dist/schema/nodes/liquid-line.js +24 -0
  137. package/dist/schema/nodes/measurement.d.ts +306 -0
  138. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  139. package/dist/schema/nodes/measurement.js +87 -0
  140. package/dist/schema/nodes/measurement.test.d.ts +2 -0
  141. package/dist/schema/nodes/measurement.test.d.ts.map +1 -0
  142. package/dist/schema/nodes/measurement.test.js +139 -0
  143. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  144. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  145. package/dist/schema/nodes/pipe-fitting.js +45 -0
  146. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  147. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  148. package/dist/schema/nodes/pipe-segment.js +36 -0
  149. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  150. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  151. package/dist/schema/nodes/pipe-trap.js +36 -0
  152. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +2 -0
  153. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +1 -0
  154. package/dist/schema/nodes/ridge-vent-defaults.test.js +205 -0
  155. package/dist/schema/nodes/ridge-vent.d.ts +18 -3
  156. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  157. package/dist/schema/nodes/ridge-vent.js +221 -3
  158. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  159. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  160. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  161. package/dist/schema/nodes/roof-segment-shape.test.d.ts +2 -0
  162. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +1 -0
  163. package/dist/schema/nodes/roof-segment-shape.test.js +175 -0
  164. package/dist/schema/nodes/roof-segment-surface.test.d.ts +2 -0
  165. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +1 -0
  166. package/dist/schema/nodes/roof-segment-surface.test.js +48 -0
  167. package/dist/schema/nodes/roof-segment-trim.test.d.ts +2 -0
  168. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +1 -0
  169. package/dist/schema/nodes/roof-segment-trim.test.js +107 -0
  170. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  171. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  172. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  173. package/dist/schema/nodes/roof-segment-walls.test.d.ts +2 -0
  174. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +1 -0
  175. package/dist/schema/nodes/roof-segment-walls.test.js +92 -0
  176. package/dist/schema/nodes/roof-segment.d.ts +84 -8
  177. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  178. package/dist/schema/nodes/roof-segment.js +290 -5
  179. package/dist/schema/nodes/roof.d.ts +8 -8
  180. package/dist/schema/nodes/shelf.d.ts +3 -2
  181. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  182. package/dist/schema/nodes/shelf.js +6 -0
  183. package/dist/schema/nodes/skylight.d.ts +10 -10
  184. package/dist/schema/nodes/slab.d.ts +3 -2
  185. package/dist/schema/nodes/slab.d.ts.map +1 -1
  186. package/dist/schema/nodes/slab.js +4 -0
  187. package/dist/schema/nodes/solar-panel.d.ts +4 -4
  188. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  189. package/dist/schema/nodes/stair.d.ts +13 -12
  190. package/dist/schema/nodes/stair.d.ts.map +1 -1
  191. package/dist/schema/nodes/stair.js +3 -0
  192. package/dist/schema/nodes/turbine-vent.d.ts +2 -2
  193. package/dist/schema/nodes/wall.d.ts +245 -6
  194. package/dist/schema/nodes/wall.d.ts.map +1 -1
  195. package/dist/schema/nodes/wall.js +257 -0
  196. package/dist/schema/nodes/wall.test.d.ts +2 -0
  197. package/dist/schema/nodes/wall.test.d.ts.map +1 -0
  198. package/dist/schema/nodes/wall.test.js +208 -0
  199. package/dist/schema/nodes/window.d.ts +11 -3
  200. package/dist/schema/nodes/window.d.ts.map +1 -1
  201. package/dist/schema/nodes/window.js +12 -0
  202. package/dist/schema/nodes/zone.d.ts +2 -0
  203. package/dist/schema/nodes/zone.d.ts.map +1 -1
  204. package/dist/schema/nodes/zone.js +6 -0
  205. package/dist/schema/scene-material.d.ts +41 -0
  206. package/dist/schema/scene-material.d.ts.map +1 -0
  207. package/dist/schema/scene-material.js +9 -0
  208. package/dist/schema/types.d.ts +1089 -94
  209. package/dist/schema/types.d.ts.map +1 -1
  210. package/dist/schema/types.js +23 -0
  211. package/dist/services/alignment-anchors.d.ts.map +1 -1
  212. package/dist/services/alignment-anchors.js +30 -1
  213. package/dist/services/alignment.d.ts +5 -0
  214. package/dist/services/alignment.d.ts.map +1 -1
  215. package/dist/services/alignment.js +2 -0
  216. package/dist/services/hosting.d.ts +8 -0
  217. package/dist/services/hosting.d.ts.map +1 -1
  218. package/dist/services/hosting.js +13 -4
  219. package/dist/services/hosting.test.js +32 -1
  220. package/dist/services/index.d.ts +8 -2
  221. package/dist/services/index.d.ts.map +1 -1
  222. package/dist/services/index.js +8 -2
  223. package/dist/services/level-height.d.ts +28 -0
  224. package/dist/services/level-height.d.ts.map +1 -0
  225. package/dist/services/level-height.js +62 -0
  226. package/dist/services/opening-guides.d.ts +141 -0
  227. package/dist/services/opening-guides.d.ts.map +1 -0
  228. package/dist/services/opening-guides.js +267 -0
  229. package/dist/services/opening-guides.test.d.ts +2 -0
  230. package/dist/services/opening-guides.test.d.ts.map +1 -0
  231. package/dist/services/opening-guides.test.js +208 -0
  232. package/dist/services/port-connectivity.d.ts +115 -0
  233. package/dist/services/port-connectivity.d.ts.map +1 -0
  234. package/dist/services/port-connectivity.js +300 -0
  235. package/dist/services/port-connectivity.test.d.ts +2 -0
  236. package/dist/services/port-connectivity.test.d.ts.map +1 -0
  237. package/dist/services/port-connectivity.test.js +297 -0
  238. package/dist/services/riser-diagram.d.ts +40 -0
  239. package/dist/services/riser-diagram.d.ts.map +1 -0
  240. package/dist/services/riser-diagram.js +110 -0
  241. package/dist/services/riser-diagram.test.d.ts +2 -0
  242. package/dist/services/riser-diagram.test.d.ts.map +1 -0
  243. package/dist/services/riser-diagram.test.js +66 -0
  244. package/dist/services/snap.d.ts +9 -1
  245. package/dist/services/snap.d.ts.map +1 -1
  246. package/dist/services/snap.js +21 -1
  247. package/dist/services/snap.test.js +43 -1
  248. package/dist/services/system-graph.d.ts +30 -0
  249. package/dist/services/system-graph.d.ts.map +1 -0
  250. package/dist/services/system-graph.js +164 -0
  251. package/dist/services/system-graph.test.d.ts +2 -0
  252. package/dist/services/system-graph.test.d.ts.map +1 -0
  253. package/dist/services/system-graph.test.js +138 -0
  254. package/dist/services/validate-dwv.d.ts +32 -0
  255. package/dist/services/validate-dwv.d.ts.map +1 -0
  256. package/dist/services/validate-dwv.js +118 -0
  257. package/dist/services/validate-dwv.test.d.ts +2 -0
  258. package/dist/services/validate-dwv.test.d.ts.map +1 -0
  259. package/dist/services/validate-dwv.test.js +109 -0
  260. package/dist/store/actions/node-actions.d.ts.map +1 -1
  261. package/dist/store/actions/node-actions.js +94 -1
  262. package/dist/store/actions/ridge-vent-update.test.d.ts +2 -0
  263. package/dist/store/actions/ridge-vent-update.test.d.ts.map +1 -0
  264. package/dist/store/actions/ridge-vent-update.test.js +264 -0
  265. package/dist/store/history-control.d.ts +11 -0
  266. package/dist/store/history-control.d.ts.map +1 -1
  267. package/dist/store/history-control.js +33 -0
  268. package/dist/store/use-scene-dirty-tracking.test.d.ts +2 -0
  269. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +1 -0
  270. package/dist/store/use-scene-dirty-tracking.test.js +68 -0
  271. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +2 -0
  272. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +1 -0
  273. package/dist/store/use-scene-measurement-roundtrip.test.js +97 -0
  274. package/dist/store/use-scene-plugins.test.d.ts +2 -0
  275. package/dist/store/use-scene-plugins.test.d.ts.map +1 -0
  276. package/dist/store/use-scene-plugins.test.js +51 -0
  277. package/dist/store/use-scene-wall-slot-migration.test.d.ts +2 -0
  278. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +1 -0
  279. package/dist/store/use-scene-wall-slot-migration.test.js +210 -0
  280. package/dist/store/use-scene-window-migration.test.d.ts +2 -0
  281. package/dist/store/use-scene-window-migration.test.d.ts.map +1 -0
  282. package/dist/store/use-scene-window-migration.test.js +85 -0
  283. package/dist/store/use-scene.d.ts +17 -2
  284. package/dist/store/use-scene.d.ts.map +1 -1
  285. package/dist/store/use-scene.js +358 -51
  286. package/dist/systems/elevator/elevator-service.js +1 -1
  287. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  288. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  289. package/dist/systems/fence/fence-centerline.js +37 -0
  290. package/dist/systems/fence/fence-spline.d.ts +39 -0
  291. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  292. package/dist/systems/fence/fence-spline.js +196 -0
  293. package/dist/systems/fence/fence-spline.test.d.ts +2 -0
  294. package/dist/systems/fence/fence-spline.test.d.ts.map +1 -0
  295. package/dist/systems/fence/fence-spline.test.js +136 -0
  296. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  297. package/dist/systems/stair/stair-footprint.js +21 -11
  298. package/dist/systems/stair/stair-opening-preview.d.ts +1139 -469
  299. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  300. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  301. package/dist/systems/stair/stair-opening-sync.js +1 -18
  302. package/dist/systems/stair/stair-opening-sync.test.js +39 -0
  303. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  304. package/dist/systems/wall/wall-mitering.js +38 -2
  305. package/dist/systems/wall/wall-mitering.test.d.ts +2 -0
  306. package/dist/systems/wall/wall-mitering.test.d.ts.map +1 -0
  307. package/dist/systems/wall/wall-mitering.test.js +63 -0
  308. package/dist/utils/clone-scene-graph.d.ts +1 -0
  309. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  310. package/dist/utils/clone-scene-graph.js +23 -3
  311. package/dist/utils/clone-scene-graph.test.js +3 -0
  312. package/dist/utils/heal-scene-graph.d.ts +18 -0
  313. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  314. package/dist/utils/heal-scene-graph.js +90 -0
  315. package/dist/utils/heal-scene-graph.test.d.ts +2 -0
  316. package/dist/utils/heal-scene-graph.test.d.ts.map +1 -0
  317. package/dist/utils/heal-scene-graph.test.js +88 -0
  318. package/dist/validation/validate-build-json.d.ts +1 -0
  319. package/dist/validation/validate-build-json.d.ts.map +1 -1
  320. package/dist/validation/validate-build-json.js +31 -2
  321. package/package.json +3 -3
@@ -0,0 +1,42 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Refrigerant lineset — the copper pipe pair that links the outdoor
4
+ * condenser to the indoor coil (furnace / air handler) of a split system.
5
+ * It is the refrigerant-side analogue of a duct run: a polyline of points,
6
+ * but carrying two lines instead of one airway.
7
+ *
8
+ * Real linesets run a fat insulated SUCTION line (cool vapour back to the
9
+ * compressor) beside a thin bare LIQUID line (warm liquid out to the coil).
10
+ * The geometry builder draws a single copper line on the path centerline
11
+ * (sized to `suctionDiameter`, wrapped in a foam jacket when `insulated`);
12
+ * draw the liquid line as a second lineset rather than both off one path.
13
+ *
14
+ * Path coordinates are level-local meters: [x, y, z] tuples, same space as
15
+ * duct paths and grid events. Diameters are nominal copper OD in inches.
16
+ */
17
+ export declare const LinesetNode: z.ZodObject<{
18
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
19
+ name: z.ZodOptional<z.ZodString>;
20
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
21
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
22
+ camera: z.ZodOptional<z.ZodObject<{
23
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
24
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
25
+ mode: z.ZodDefault<z.ZodEnum<{
26
+ perspective: "perspective";
27
+ orthographic: "orthographic";
28
+ }>>;
29
+ fov: z.ZodOptional<z.ZodNumber>;
30
+ zoom: z.ZodOptional<z.ZodNumber>;
31
+ }, z.core.$strip>>;
32
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
33
+ id: z.ZodDefault<z.ZodTemplateLiteral<`lineset_${string}`>>;
34
+ type: z.ZodDefault<z.ZodLiteral<"lineset">>;
35
+ path: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
36
+ suctionDiameter: z.ZodDefault<z.ZodNumber>;
37
+ liquidDiameter: z.ZodDefault<z.ZodNumber>;
38
+ insulated: z.ZodDefault<z.ZodBoolean>;
39
+ }, z.core.$strip>;
40
+ export type LinesetNode = z.infer<typeof LinesetNode>;
41
+ export type LinesetNodeId = LinesetNode['id'];
42
+ //# sourceMappingURL=lineset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lineset.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/lineset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;iBAqBvB,CAAA;AACD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AACrD,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,38 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ /**
5
+ * Refrigerant lineset — the copper pipe pair that links the outdoor
6
+ * condenser to the indoor coil (furnace / air handler) of a split system.
7
+ * It is the refrigerant-side analogue of a duct run: a polyline of points,
8
+ * but carrying two lines instead of one airway.
9
+ *
10
+ * Real linesets run a fat insulated SUCTION line (cool vapour back to the
11
+ * compressor) beside a thin bare LIQUID line (warm liquid out to the coil).
12
+ * The geometry builder draws a single copper line on the path centerline
13
+ * (sized to `suctionDiameter`, wrapped in a foam jacket when `insulated`);
14
+ * draw the liquid line as a second lineset rather than both off one path.
15
+ *
16
+ * Path coordinates are level-local meters: [x, y, z] tuples, same space as
17
+ * duct paths and grid events. Diameters are nominal copper OD in inches.
18
+ */
19
+ export const LinesetNode = BaseNode.extend({
20
+ id: objectId('lineset'),
21
+ type: nodeType('lineset'),
22
+ // Polyline path in level-local meters. Minimum two points (start, end).
23
+ path: z.array(z.tuple([z.number(), z.number(), z.number()])).min(2),
24
+ // Nominal suction-line copper OD in inches (the large insulated line).
25
+ // Common residential sizes are 3/4"–1-1/8".
26
+ suctionDiameter: z.number().min(0.25).max(2).default(0.875),
27
+ // Nominal liquid-line copper OD in inches (the small bare line).
28
+ // Common residential sizes are 1/4"–3/8".
29
+ liquidDiameter: z.number().min(0.125).max(1).default(0.375),
30
+ // Whether the suction line carries its foam insulation jacket. Bare = false.
31
+ insulated: z.boolean().default(true),
32
+ }).describe(dedent `
33
+ Refrigerant lineset - copper suction + liquid pair linking a condenser to an indoor coil.
34
+ - path: list of [x, y, z] points in level-local meters (min 2)
35
+ - suctionDiameter: nominal copper OD in inches of the large insulated line (typ. 3/4"-1-1/8")
36
+ - liquidDiameter: nominal copper OD in inches of the small bare line (typ. 1/4"-3/8")
37
+ - insulated: whether the suction line wears its foam jacket
38
+ `);
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Standalone refrigerant liquid line — the thin bare-copper line that carries
4
+ * warm liquid out to the indoor coil. It is the line that used to be drawn as
5
+ * the lineset's second rail; broken out here as its own polyline run so it can
6
+ * be drawn on its own, including traced alongside an existing lineset.
7
+ *
8
+ * Path coordinates are level-local meters: [x, y, z] tuples, the same space as
9
+ * lineset and duct paths. Diameter is nominal copper OD in inches.
10
+ */
11
+ export declare const LiquidLineNode: z.ZodObject<{
12
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
13
+ name: z.ZodOptional<z.ZodString>;
14
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
15
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
16
+ camera: z.ZodOptional<z.ZodObject<{
17
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
18
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
19
+ mode: z.ZodDefault<z.ZodEnum<{
20
+ perspective: "perspective";
21
+ orthographic: "orthographic";
22
+ }>>;
23
+ fov: z.ZodOptional<z.ZodNumber>;
24
+ zoom: z.ZodOptional<z.ZodNumber>;
25
+ }, z.core.$strip>>;
26
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
27
+ id: z.ZodDefault<z.ZodTemplateLiteral<`liquid-line_${string}`>>;
28
+ type: z.ZodDefault<z.ZodLiteral<"liquid-line">>;
29
+ path: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
30
+ diameter: z.ZodDefault<z.ZodNumber>;
31
+ }, z.core.$strip>;
32
+ export type LiquidLineNode = z.infer<typeof LiquidLineNode>;
33
+ export type LiquidLineNodeId = LiquidLineNode['id'];
34
+ //# sourceMappingURL=liquid-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquid-line.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/liquid-line.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;iBAa1B,CAAA;AACD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,24 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ /**
5
+ * Standalone refrigerant liquid line — the thin bare-copper line that carries
6
+ * warm liquid out to the indoor coil. It is the line that used to be drawn as
7
+ * the lineset's second rail; broken out here as its own polyline run so it can
8
+ * be drawn on its own, including traced alongside an existing lineset.
9
+ *
10
+ * Path coordinates are level-local meters: [x, y, z] tuples, the same space as
11
+ * lineset and duct paths. Diameter is nominal copper OD in inches.
12
+ */
13
+ export const LiquidLineNode = BaseNode.extend({
14
+ id: objectId('liquid-line'),
15
+ type: nodeType('liquid-line'),
16
+ // Polyline path in level-local meters. Minimum two points (start, end).
17
+ path: z.array(z.tuple([z.number(), z.number(), z.number()])).min(2),
18
+ // Nominal copper OD in inches. Common residential sizes are 1/4"–3/8".
19
+ diameter: z.number().min(0.125).max(1).default(0.375),
20
+ }).describe(dedent `
21
+ Standalone refrigerant liquid line - a thin bare-copper polyline run.
22
+ - path: list of [x, y, z] points in level-local meters (min 2)
23
+ - diameter: nominal copper OD in inches (typ. 1/4"-3/8")
24
+ `);
@@ -0,0 +1,306 @@
1
+ import { z } from 'zod';
2
+ export declare const MeasurementPoint: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
3
+ export declare const MeasurementFeatureParameter: z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>;
4
+ export declare const MeasurementFeatureReference: z.ZodObject<{
5
+ nodeId: z.ZodString;
6
+ featureId: z.ZodString;
7
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
8
+ }, z.core.$strip>;
9
+ export declare const MeasurementFeatureAnchor: z.ZodObject<{
10
+ kind: z.ZodLiteral<"feature">;
11
+ reference: z.ZodObject<{
12
+ nodeId: z.ZodString;
13
+ featureId: z.ZodString;
14
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
15
+ }, z.core.$strip>;
16
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
17
+ }, z.core.$strip>;
18
+ /** A tuple is a free anchor and remains the compact legacy representation. */
19
+ export declare const MeasurementAnchor: z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
20
+ kind: z.ZodLiteral<"feature">;
21
+ reference: z.ZodObject<{
22
+ nodeId: z.ZodString;
23
+ featureId: z.ZodString;
24
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
25
+ }, z.core.$strip>;
26
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
27
+ }, z.core.$strip>]>;
28
+ export declare const DistanceMeasurement: z.ZodObject<{
29
+ kind: z.ZodLiteral<"distance">;
30
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
31
+ kind: z.ZodLiteral<"feature">;
32
+ reference: z.ZodObject<{
33
+ nodeId: z.ZodString;
34
+ featureId: z.ZodString;
35
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
36
+ }, z.core.$strip>;
37
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
38
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
39
+ kind: z.ZodLiteral<"feature">;
40
+ reference: z.ZodObject<{
41
+ nodeId: z.ZodString;
42
+ featureId: z.ZodString;
43
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
44
+ }, z.core.$strip>;
45
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
46
+ }, z.core.$strip>]>], null>;
47
+ }, z.core.$strip>;
48
+ export declare const AngleMeasurement: z.ZodObject<{
49
+ kind: z.ZodLiteral<"angle">;
50
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
51
+ kind: z.ZodLiteral<"feature">;
52
+ reference: z.ZodObject<{
53
+ nodeId: z.ZodString;
54
+ featureId: z.ZodString;
55
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
56
+ }, z.core.$strip>;
57
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
58
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
59
+ kind: z.ZodLiteral<"feature">;
60
+ reference: z.ZodObject<{
61
+ nodeId: z.ZodString;
62
+ featureId: z.ZodString;
63
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
64
+ }, z.core.$strip>;
65
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
66
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
67
+ kind: z.ZodLiteral<"feature">;
68
+ reference: z.ZodObject<{
69
+ nodeId: z.ZodString;
70
+ featureId: z.ZodString;
71
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
72
+ }, z.core.$strip>;
73
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
74
+ }, z.core.$strip>]>], null>;
75
+ }, z.core.$strip>;
76
+ export declare const AreaMeasurement: z.ZodObject<{
77
+ kind: z.ZodLiteral<"area">;
78
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
79
+ kind: z.ZodLiteral<"feature">;
80
+ reference: z.ZodObject<{
81
+ nodeId: z.ZodString;
82
+ featureId: z.ZodString;
83
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
84
+ }, z.core.$strip>;
85
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
86
+ }, z.core.$strip>]>>;
87
+ }, z.core.$strip>;
88
+ export declare const PerimeterMeasurement: z.ZodObject<{
89
+ kind: z.ZodLiteral<"perimeter">;
90
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
91
+ kind: z.ZodLiteral<"feature">;
92
+ reference: z.ZodObject<{
93
+ nodeId: z.ZodString;
94
+ featureId: z.ZodString;
95
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
96
+ }, z.core.$strip>;
97
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
98
+ }, z.core.$strip>]>>;
99
+ }, z.core.$strip>;
100
+ export declare const VolumeMeasurement: z.ZodObject<{
101
+ kind: z.ZodLiteral<"volume">;
102
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
103
+ kind: z.ZodLiteral<"feature">;
104
+ reference: z.ZodObject<{
105
+ nodeId: z.ZodString;
106
+ featureId: z.ZodString;
107
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
108
+ }, z.core.$strip>;
109
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
110
+ }, z.core.$strip>]>>;
111
+ extrusion: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
112
+ }, z.core.$strip>;
113
+ export declare const MeasurementPayload: z.ZodDiscriminatedUnion<[z.ZodObject<{
114
+ kind: z.ZodLiteral<"distance">;
115
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
116
+ kind: z.ZodLiteral<"feature">;
117
+ reference: z.ZodObject<{
118
+ nodeId: z.ZodString;
119
+ featureId: z.ZodString;
120
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
121
+ }, z.core.$strip>;
122
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
123
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
124
+ kind: z.ZodLiteral<"feature">;
125
+ reference: z.ZodObject<{
126
+ nodeId: z.ZodString;
127
+ featureId: z.ZodString;
128
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
129
+ }, z.core.$strip>;
130
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
131
+ }, z.core.$strip>]>], null>;
132
+ }, z.core.$strip>, z.ZodObject<{
133
+ kind: z.ZodLiteral<"angle">;
134
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
135
+ kind: z.ZodLiteral<"feature">;
136
+ reference: z.ZodObject<{
137
+ nodeId: z.ZodString;
138
+ featureId: z.ZodString;
139
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
140
+ }, z.core.$strip>;
141
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
142
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
143
+ kind: z.ZodLiteral<"feature">;
144
+ reference: z.ZodObject<{
145
+ nodeId: z.ZodString;
146
+ featureId: z.ZodString;
147
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
148
+ }, z.core.$strip>;
149
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
150
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
151
+ kind: z.ZodLiteral<"feature">;
152
+ reference: z.ZodObject<{
153
+ nodeId: z.ZodString;
154
+ featureId: z.ZodString;
155
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
156
+ }, z.core.$strip>;
157
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
158
+ }, z.core.$strip>]>], null>;
159
+ }, z.core.$strip>, z.ZodObject<{
160
+ kind: z.ZodLiteral<"area">;
161
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
162
+ kind: z.ZodLiteral<"feature">;
163
+ reference: z.ZodObject<{
164
+ nodeId: z.ZodString;
165
+ featureId: z.ZodString;
166
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
167
+ }, z.core.$strip>;
168
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
169
+ }, z.core.$strip>]>>;
170
+ }, z.core.$strip>, z.ZodObject<{
171
+ kind: z.ZodLiteral<"perimeter">;
172
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
173
+ kind: z.ZodLiteral<"feature">;
174
+ reference: z.ZodObject<{
175
+ nodeId: z.ZodString;
176
+ featureId: z.ZodString;
177
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
178
+ }, z.core.$strip>;
179
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
180
+ }, z.core.$strip>]>>;
181
+ }, z.core.$strip>, z.ZodObject<{
182
+ kind: z.ZodLiteral<"volume">;
183
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
184
+ kind: z.ZodLiteral<"feature">;
185
+ reference: z.ZodObject<{
186
+ nodeId: z.ZodString;
187
+ featureId: z.ZodString;
188
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
189
+ }, z.core.$strip>;
190
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
191
+ }, z.core.$strip>]>>;
192
+ extrusion: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
193
+ }, z.core.$strip>], "kind">;
194
+ export declare const MeasurementNode: z.ZodObject<{
195
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
196
+ name: z.ZodOptional<z.ZodString>;
197
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
198
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
199
+ camera: z.ZodOptional<z.ZodObject<{
200
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
201
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
202
+ mode: z.ZodDefault<z.ZodEnum<{
203
+ perspective: "perspective";
204
+ orthographic: "orthographic";
205
+ }>>;
206
+ fov: z.ZodOptional<z.ZodNumber>;
207
+ zoom: z.ZodOptional<z.ZodNumber>;
208
+ }, z.core.$strip>>;
209
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
210
+ id: z.ZodDefault<z.ZodTemplateLiteral<`measurement_${string}`>>;
211
+ type: z.ZodDefault<z.ZodLiteral<"measurement">>;
212
+ measurement: z.ZodDiscriminatedUnion<[z.ZodObject<{
213
+ kind: z.ZodLiteral<"distance">;
214
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
215
+ kind: z.ZodLiteral<"feature">;
216
+ reference: z.ZodObject<{
217
+ nodeId: z.ZodString;
218
+ featureId: z.ZodString;
219
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
220
+ }, z.core.$strip>;
221
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
222
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
223
+ kind: z.ZodLiteral<"feature">;
224
+ reference: z.ZodObject<{
225
+ nodeId: z.ZodString;
226
+ featureId: z.ZodString;
227
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
228
+ }, z.core.$strip>;
229
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
230
+ }, z.core.$strip>]>], null>;
231
+ }, z.core.$strip>, z.ZodObject<{
232
+ kind: z.ZodLiteral<"angle">;
233
+ points: z.ZodTuple<[z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
234
+ kind: z.ZodLiteral<"feature">;
235
+ reference: z.ZodObject<{
236
+ nodeId: z.ZodString;
237
+ featureId: z.ZodString;
238
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
239
+ }, z.core.$strip>;
240
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
241
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
242
+ kind: z.ZodLiteral<"feature">;
243
+ reference: z.ZodObject<{
244
+ nodeId: z.ZodString;
245
+ featureId: z.ZodString;
246
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
247
+ }, z.core.$strip>;
248
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
249
+ }, z.core.$strip>]>, z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
250
+ kind: z.ZodLiteral<"feature">;
251
+ reference: z.ZodObject<{
252
+ nodeId: z.ZodString;
253
+ featureId: z.ZodString;
254
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
255
+ }, z.core.$strip>;
256
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
257
+ }, z.core.$strip>]>], null>;
258
+ }, z.core.$strip>, z.ZodObject<{
259
+ kind: z.ZodLiteral<"area">;
260
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
261
+ kind: z.ZodLiteral<"feature">;
262
+ reference: z.ZodObject<{
263
+ nodeId: z.ZodString;
264
+ featureId: z.ZodString;
265
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
266
+ }, z.core.$strip>;
267
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
268
+ }, z.core.$strip>]>>;
269
+ }, z.core.$strip>, z.ZodObject<{
270
+ kind: z.ZodLiteral<"perimeter">;
271
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
272
+ kind: z.ZodLiteral<"feature">;
273
+ reference: z.ZodObject<{
274
+ nodeId: z.ZodString;
275
+ featureId: z.ZodString;
276
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
277
+ }, z.core.$strip>;
278
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
279
+ }, z.core.$strip>]>>;
280
+ }, z.core.$strip>, z.ZodObject<{
281
+ kind: z.ZodLiteral<"volume">;
282
+ base: z.ZodArray<z.ZodUnion<readonly [z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>, z.ZodObject<{
283
+ kind: z.ZodLiteral<"feature">;
284
+ reference: z.ZodObject<{
285
+ nodeId: z.ZodString;
286
+ featureId: z.ZodString;
287
+ parameters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodBoolean, z.ZodNumber]>>>;
288
+ }, z.core.$strip>;
289
+ fallback: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
290
+ }, z.core.$strip>]>>;
291
+ extrusion: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
292
+ }, z.core.$strip>], "kind">;
293
+ }, z.core.$strip>;
294
+ export type MeasurementPoint = z.infer<typeof MeasurementPoint>;
295
+ export type MeasurementFeatureParameter = z.infer<typeof MeasurementFeatureParameter>;
296
+ export type MeasurementFeatureReference = z.infer<typeof MeasurementFeatureReference>;
297
+ export type MeasurementFeatureAnchor = z.infer<typeof MeasurementFeatureAnchor>;
298
+ export type MeasurementAnchor = z.infer<typeof MeasurementAnchor>;
299
+ export type DistanceMeasurement = z.infer<typeof DistanceMeasurement>;
300
+ export type AngleMeasurement = z.infer<typeof AngleMeasurement>;
301
+ export type AreaMeasurement = z.infer<typeof AreaMeasurement>;
302
+ export type PerimeterMeasurement = z.infer<typeof PerimeterMeasurement>;
303
+ export type VolumeMeasurement = z.infer<typeof VolumeMeasurement>;
304
+ export type MeasurementPayload = z.infer<typeof MeasurementPayload>;
305
+ export type MeasurementNode = z.infer<typeof MeasurementNode>;
306
+ //# sourceMappingURL=measurement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurement.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/measurement.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAUvB,eAAO,MAAM,gBAAgB,2DAAkE,CAAA;AAE/F,eAAO,MAAM,2BAA2B,+DAAuD,CAAA;AAE/F,eAAO,MAAM,2BAA2B;;;;iBAItC,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;iBAInC,CAAA;AAEF,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB;;;;;;;;mBAAwD,CAAA;AAiBtF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;iBAG9B,CAAA;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG3B,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;iBAG1B,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;iBAG/B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;iBAsB1B,CAAA;AAEJ,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAM7B,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAa3B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AACrF,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AACrF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AACjE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AACnE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA"}
@@ -0,0 +1,87 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { areMeasurementPointsCoplanar, MEASUREMENT_PLANAR_TOLERANCE, measurementNormal, } from '../../lib/measurement-geometry';
4
+ import { BaseNode, nodeType, objectId } from '../base';
5
+ const FiniteCoordinate = z.number().finite();
6
+ export const MeasurementPoint = z.tuple([FiniteCoordinate, FiniteCoordinate, FiniteCoordinate]);
7
+ export const MeasurementFeatureParameter = z.union([z.string(), z.boolean(), FiniteCoordinate]);
8
+ export const MeasurementFeatureReference = z.object({
9
+ nodeId: z.string().min(1),
10
+ featureId: z.string().min(1),
11
+ parameters: z.record(z.string(), MeasurementFeatureParameter).optional(),
12
+ });
13
+ export const MeasurementFeatureAnchor = z.object({
14
+ kind: z.literal('feature'),
15
+ reference: MeasurementFeatureReference,
16
+ fallback: MeasurementPoint,
17
+ });
18
+ /** A tuple is a free anchor and remains the compact legacy representation. */
19
+ export const MeasurementAnchor = z.union([MeasurementPoint, MeasurementFeatureAnchor]);
20
+ const fallbackPoint = (anchor) => Array.isArray(anchor) ? anchor : anchor.fallback;
21
+ const PlanarMeasurementBase = z
22
+ .array(MeasurementAnchor)
23
+ .min(3)
24
+ .superRefine((anchors, ctx) => {
25
+ if (!areMeasurementPointsCoplanar(anchors.map(fallbackPoint), MEASUREMENT_PLANAR_TOLERANCE)) {
26
+ ctx.addIssue({
27
+ code: 'custom',
28
+ message: 'Measurement base must be planar and enclose an area',
29
+ });
30
+ }
31
+ });
32
+ export const DistanceMeasurement = z.object({
33
+ kind: z.literal('distance'),
34
+ points: z.tuple([MeasurementAnchor, MeasurementAnchor]),
35
+ });
36
+ export const AngleMeasurement = z.object({
37
+ kind: z.literal('angle'),
38
+ points: z.tuple([MeasurementAnchor, MeasurementAnchor, MeasurementAnchor]),
39
+ });
40
+ export const AreaMeasurement = z.object({
41
+ kind: z.literal('area'),
42
+ base: PlanarMeasurementBase,
43
+ });
44
+ export const PerimeterMeasurement = z.object({
45
+ kind: z.literal('perimeter'),
46
+ base: PlanarMeasurementBase,
47
+ });
48
+ export const VolumeMeasurement = z
49
+ .object({
50
+ kind: z.literal('volume'),
51
+ base: PlanarMeasurementBase,
52
+ extrusion: MeasurementPoint,
53
+ })
54
+ .superRefine((measurement, ctx) => {
55
+ const normal = measurementNormal(measurement.base.map(fallbackPoint));
56
+ const normalComponent = normal
57
+ ? Math.abs(normal[0] * measurement.extrusion[0] +
58
+ normal[1] * measurement.extrusion[1] +
59
+ normal[2] * measurement.extrusion[2])
60
+ : 0;
61
+ if (normalComponent <= 1e-9) {
62
+ ctx.addIssue({
63
+ code: 'custom',
64
+ path: ['extrusion'],
65
+ message: 'Measurement extrusion must have a non-zero normal component',
66
+ });
67
+ }
68
+ });
69
+ export const MeasurementPayload = z.discriminatedUnion('kind', [
70
+ DistanceMeasurement,
71
+ AngleMeasurement,
72
+ AreaMeasurement,
73
+ PerimeterMeasurement,
74
+ VolumeMeasurement,
75
+ ]);
76
+ export const MeasurementNode = BaseNode.extend({
77
+ id: objectId('measurement'),
78
+ type: nodeType('measurement'),
79
+ measurement: MeasurementPayload,
80
+ }).describe(dedent `
81
+ Measurement node - a persistent level-local 3D measurement annotation
82
+ - distance: exactly two level-local anchors
83
+ - angle: exactly three anchors, with the middle anchor as the vertex
84
+ - area/perimeter: an ordered planar base with at least three anchors
85
+ - volume: an ordered planar base with an extrusion vector
86
+ - an anchor is either a free point tuple or a semantic feature reference with a fallback
87
+ `);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=measurement.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurement.test.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/measurement.test.ts"],"names":[],"mappings":""}