@snaptrude/plugin-core 0.9.16 → 0.9.18-networks-20261016.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/AGENTS.md +231 -231
  2. package/CHANGELOG.md +408 -402
  3. package/CLAUDE.md +11 -11
  4. package/dist/api/analysis/daylight.d.ts +5 -5
  5. package/dist/api/analysis/solar.d.ts +2 -2
  6. package/dist/api/core/camera/index.d.ts +29 -0
  7. package/dist/api/core/camera/index.d.ts.map +1 -1
  8. package/dist/api/core/geom/create/index.d.ts +7 -1
  9. package/dist/api/core/geom/create/index.d.ts.map +1 -1
  10. package/dist/api/core/geom/update/contour.d.ts +8 -2
  11. package/dist/api/core/geom/update/contour.d.ts.map +1 -1
  12. package/dist/api/core/zoom/index.d.ts +13 -0
  13. package/dist/api/core/zoom/index.d.ts.map +1 -1
  14. package/dist/api/design/bim.d.ts +209 -0
  15. package/dist/api/design/bim.d.ts.map +1 -0
  16. package/dist/api/design/boolean/index.d.ts +2 -0
  17. package/dist/api/design/boolean/index.d.ts.map +1 -1
  18. package/dist/api/design/catalog.d.ts +320 -0
  19. package/dist/api/design/catalog.d.ts.map +1 -0
  20. package/dist/api/design/create/bulk-items.d.ts +65 -25
  21. package/dist/api/design/create/bulk-items.d.ts.map +1 -1
  22. package/dist/api/design/create/index.d.ts +272 -99
  23. package/dist/api/design/create/index.d.ts.map +1 -1
  24. package/dist/api/design/create/opening-fields.d.ts +13 -12
  25. package/dist/api/design/create/opening-fields.d.ts.map +1 -1
  26. package/dist/api/design/delete/index.d.ts +1 -0
  27. package/dist/api/design/delete/index.d.ts.map +1 -1
  28. package/dist/api/design/doors/index.d.ts +18 -24
  29. package/dist/api/design/doors/index.d.ts.map +1 -1
  30. package/dist/api/design/family.d.ts +797 -27
  31. package/dist/api/design/family.d.ts.map +1 -1
  32. package/dist/api/design/index.d.ts +16 -0
  33. package/dist/api/design/index.d.ts.map +1 -1
  34. package/dist/api/design/networks.d.ts +1763 -0
  35. package/dist/api/design/networks.d.ts.map +1 -0
  36. package/dist/api/design/query/index.d.ts +42 -32
  37. package/dist/api/design/query/index.d.ts.map +1 -1
  38. package/dist/api/design/selection/index.d.ts +10 -10
  39. package/dist/api/design/types/index.d.ts +40 -24
  40. package/dist/api/design/types/index.d.ts.map +1 -1
  41. package/dist/api/design/update/index.d.ts +43 -3
  42. package/dist/api/design/update/index.d.ts.map +1 -1
  43. package/dist/api/design/windows/index.d.ts +8 -8
  44. package/dist/api/design/windows/index.d.ts.map +1 -1
  45. package/dist/api/presentation/aiInspiration.d.ts +10 -10
  46. package/dist/api/presentation/annotate.d.ts +38 -22
  47. package/dist/api/presentation/annotate.d.ts.map +1 -1
  48. package/dist/api/presentation/drawingContract.d.ts +32 -0
  49. package/dist/api/presentation/drawingContract.d.ts.map +1 -0
  50. package/dist/api/presentation/drawings.d.ts +3523 -0
  51. package/dist/api/presentation/drawings.d.ts.map +1 -0
  52. package/dist/api/presentation/export.d.ts +23 -5
  53. package/dist/api/presentation/export.d.ts.map +1 -1
  54. package/dist/api/presentation/index.d.ts +41 -12
  55. package/dist/api/presentation/index.d.ts.map +1 -1
  56. package/dist/api/presentation/placedViews.d.ts +106 -6
  57. package/dist/api/presentation/placedViews.d.ts.map +1 -1
  58. package/dist/api/presentation/sections.d.ts +461 -0
  59. package/dist/api/presentation/sections.d.ts.map +1 -0
  60. package/dist/api/presentation/shapes.d.ts +2 -2
  61. package/dist/api/presentation/sheets.d.ts +175 -19
  62. package/dist/api/presentation/sheets.d.ts.map +1 -1
  63. package/dist/api/presentation/viewPresets.d.ts +222 -0
  64. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  65. package/dist/api/presentation/views.d.ts +103 -5
  66. package/dist/api/presentation/views.d.ts.map +1 -1
  67. package/dist/api/presentation/walkthroughs.d.ts +6 -6
  68. package/dist/errors/codes.d.ts +3 -1
  69. package/dist/errors/codes.d.ts.map +1 -1
  70. package/dist/index.cjs +3788 -2328
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.js +3650 -2328
  73. package/dist/index.js.map +1 -1
  74. package/package.json +42 -42
  75. package/scripts/check-dist-fresh.mjs +22 -22
  76. package/scripts/generate-manifest.mjs +243 -238
  77. package/scripts/generate-manifest.test.mjs +303 -303
  78. package/src/api/analysis/daylight.ts +470 -470
  79. package/src/api/analysis/heatmaps.ts +683 -683
  80. package/src/api/analysis/illuminance.ts +155 -155
  81. package/src/api/analysis/index.ts +61 -61
  82. package/src/api/analysis/shadows.ts +183 -183
  83. package/src/api/analysis/solar.ts +237 -237
  84. package/src/api/analysis/sunlightHours.ts +211 -211
  85. package/src/api/analysis/sunpath.ts +83 -83
  86. package/src/api/analysis/weather.ts +179 -179
  87. package/src/api/core/buildings.ts +485 -485
  88. package/src/api/core/camera/index.ts +696 -667
  89. package/src/api/core/comment/index.ts +376 -376
  90. package/src/api/core/geom/create/index.ts +2139 -2133
  91. package/src/api/core/geom/delete/index.ts +84 -84
  92. package/src/api/core/geom/index.ts +35 -35
  93. package/src/api/core/geom/query/arc.ts +169 -169
  94. package/src/api/core/geom/query/brep.ts +621 -621
  95. package/src/api/core/geom/query/circle.ts +404 -404
  96. package/src/api/core/geom/query/contour.ts +540 -540
  97. package/src/api/core/geom/query/curve.ts +1102 -1102
  98. package/src/api/core/geom/query/edge.ts +130 -130
  99. package/src/api/core/geom/query/face.ts +508 -508
  100. package/src/api/core/geom/query/halfedge.ts +210 -210
  101. package/src/api/core/geom/query/index.ts +63 -63
  102. package/src/api/core/geom/query/profile.ts +473 -473
  103. package/src/api/core/geom/query/vertex.ts +205 -205
  104. package/src/api/core/geom/update/contour.ts +323 -317
  105. package/src/api/core/geom/update/curve.ts +209 -209
  106. package/src/api/core/geom/update/index.ts +29 -29
  107. package/src/api/core/geom/update/profile.ts +379 -379
  108. package/src/api/core/groups.ts +521 -521
  109. package/src/api/core/handles/index.ts +234 -234
  110. package/src/api/core/history/index.ts +84 -84
  111. package/src/api/core/index.ts +99 -99
  112. package/src/api/core/io/export/index.ts +126 -126
  113. package/src/api/core/io/import/index.ts +504 -504
  114. package/src/api/core/io/index.ts +42 -42
  115. package/src/api/core/io/job/index.ts +140 -140
  116. package/src/api/core/io/query/index.ts +71 -71
  117. package/src/api/core/io/terrain/index.ts +360 -360
  118. package/src/api/core/io/underlay/index.ts +705 -705
  119. package/src/api/core/layers.ts +540 -540
  120. package/src/api/core/math/index.ts +20 -20
  121. package/src/api/core/math/quat.ts +172 -172
  122. package/src/api/core/math/vec3.ts +179 -179
  123. package/src/api/core/mode/index.ts +108 -108
  124. package/src/api/core/project/index.ts +479 -479
  125. package/src/api/core/proposals/index.ts +570 -570
  126. package/src/api/core/storeys/index.ts +308 -308
  127. package/src/api/core/storeys/layers.ts +339 -339
  128. package/src/api/core/tags.ts +911 -911
  129. package/src/api/core/units/index.ts +164 -164
  130. package/src/api/core/user.ts +46 -46
  131. package/src/api/core/zoom/index.ts +64 -51
  132. package/src/api/design/bim.ts +121 -0
  133. package/src/api/design/boolean/index.ts +181 -179
  134. package/src/api/design/catalog.ts +203 -0
  135. package/src/api/design/create/bulk-items.ts +294 -254
  136. package/src/api/design/create/grids.ts +137 -137
  137. package/src/api/design/create/index.ts +2148 -1980
  138. package/src/api/design/create/opening-fields.ts +40 -37
  139. package/src/api/design/delete/index.ts +75 -74
  140. package/src/api/design/dimensions.ts +453 -453
  141. package/src/api/design/doors/index.ts +516 -500
  142. package/src/api/design/edit/index.ts +54 -54
  143. package/src/api/design/erase/index.ts +151 -151
  144. package/src/api/design/family.ts +1334 -704
  145. package/src/api/design/furniture/index.ts +319 -319
  146. package/src/api/design/grids.ts +237 -237
  147. package/src/api/design/index.ts +304 -274
  148. package/src/api/design/lock.ts +69 -69
  149. package/src/api/design/materials/index.ts +608 -608
  150. package/src/api/design/networks.ts +667 -0
  151. package/src/api/design/query/geometry/index.ts +319 -319
  152. package/src/api/design/query/grids.ts +197 -197
  153. package/src/api/design/query/index.ts +1236 -1226
  154. package/src/api/design/query/referenceLines.ts +52 -52
  155. package/src/api/design/query/spaces.ts +275 -275
  156. package/src/api/design/selection/index.ts +273 -273
  157. package/src/api/design/shared.ts +40 -40
  158. package/src/api/design/transform/index.ts +254 -254
  159. package/src/api/design/types/index.ts +163 -156
  160. package/src/api/design/update/index.ts +1024 -983
  161. package/src/api/design/visibility.ts +143 -143
  162. package/src/api/design/windows/index.ts +351 -333
  163. package/src/api/entity/buildableEnvelope.ts +322 -322
  164. package/src/api/entity/index.ts +30 -30
  165. package/src/api/entity/referenceLine.ts +235 -235
  166. package/src/api/entity/space.ts +612 -612
  167. package/src/api/entity/story.ts +517 -517
  168. package/src/api/index.ts +47 -47
  169. package/src/api/presentation/aiInspiration.ts +1116 -1116
  170. package/src/api/presentation/annotate.ts +417 -385
  171. package/src/api/presentation/camera.ts +289 -289
  172. package/src/api/presentation/diagrams.ts +194 -194
  173. package/src/api/presentation/drawingContract.ts +70 -0
  174. package/src/api/presentation/drawings.ts +1179 -0
  175. package/src/api/presentation/export.ts +134 -108
  176. package/src/api/presentation/import.ts +159 -159
  177. package/src/api/presentation/index.ts +160 -126
  178. package/src/api/presentation/placedViews.ts +1211 -1120
  179. package/src/api/presentation/sections.ts +420 -0
  180. package/src/api/presentation/shapes.ts +274 -274
  181. package/src/api/presentation/sheets.ts +746 -585
  182. package/src/api/presentation/slideshow.ts +134 -134
  183. package/src/api/presentation/tables.ts +84 -84
  184. package/src/api/presentation/viewPresets.ts +241 -0
  185. package/src/api/presentation/views.ts +713 -673
  186. package/src/api/presentation/walkthroughs.ts +1201 -1201
  187. package/src/api/program/adjacency.ts +164 -164
  188. package/src/api/program/areas.ts +408 -408
  189. package/src/api/program/classification.ts +138 -138
  190. package/src/api/program/cores.ts +83 -83
  191. package/src/api/program/departments.ts +517 -517
  192. package/src/api/program/index.ts +73 -73
  193. package/src/api/program/labels.ts +332 -332
  194. package/src/api/program/layout.ts +422 -422
  195. package/src/api/program/metadata.ts +364 -364
  196. package/src/api/program/metrics.ts +120 -120
  197. package/src/api/program/site.ts +748 -748
  198. package/src/api/program/spreadsheet.ts +2698 -2698
  199. package/src/api/workspace/index.ts +612 -612
  200. package/src/errors/codes.ts +143 -136
  201. package/src/errors/envelope.ts +75 -75
  202. package/src/errors/index.ts +21 -21
  203. package/src/errors/plugin-error.ts +134 -134
  204. package/src/handles.ts +297 -297
  205. package/src/host-utils.ts +67 -67
  206. package/src/index.ts +7 -7
  207. package/src/massParameters.ops.ts +246 -246
  208. package/src/massParameters.ts +427 -427
  209. package/src/types.ts +16 -16
  210. package/test/drawingContract.test.mjs +288 -0
  211. package/test/errors.test.mjs +185 -184
  212. package/test/massParameters.test.mjs +952 -952
  213. package/tsconfig.json +22 -22
  214. package/tsup.config.ts +12 -12
  215. package/api-manifest.json +0 -9618
@@ -1,164 +1,164 @@
1
- import * as z from "zod"
2
- import { PluginApiReturn } from "../../../types"
3
-
4
- /**
5
- * Unit-type queries and conversion.
6
- *
7
- * Snaptrude stores all geometry in an internal `babylon` unit. These methods
8
- * read the available unit types, the internal (`babylon`) type, and the current
9
- * project type; set the current project type; and convert values between any two
10
- * unit types.
11
- *
12
- * Accessed via `snaptrude.core.units`.
13
- */
14
- export abstract class PluginUnitsApi {
15
- constructor() {}
16
-
17
- /**
18
- * List the selectable real-world unit types (excludes the internal `babylon`
19
- * storage type, which is read via {@linkcode PluginUnitsApi.getBabylonType}).
20
- *
21
- * @examplePrompt What units can I use in this project?
22
- * @examplePrompt List all the available measurement units
23
- * @examplePrompt Which unit systems does Snaptrude support?
24
- * @examplePrompt Show the unit options I could switch the model to
25
- *
26
- * # Example
27
- * ```ts
28
- * const types = await snaptrude.core.units.listTypes()
29
- * console.log(types) // ["meters", "feet-inches", "inches", ...]
30
- * ```
31
- */
32
- public abstract listTypes(): PluginApiReturn<PUnitType[]>
33
-
34
- /**
35
- * Get the internal storage unit type that all geometry is kept in — always
36
- * `"babylon"` — for use as one side of a {@linkcode PluginUnitsApi.convert} call.
37
- *
38
- * @examplePrompt What unit does Snaptrude store geometry in internally?
39
- * @examplePrompt Get the internal babylon unit type
40
- * @examplePrompt Which unit are raw model coordinates saved in?
41
- *
42
- * # Example
43
- * ```ts
44
- * const babylon = await snaptrude.core.units.getBabylonType() // "babylon"
45
- * const meters = await snaptrude.core.units.convert(10, babylon, "meters")
46
- * ```
47
- */
48
- public abstract getBabylonType(): PluginApiReturn<PUnitType>
49
-
50
- /**
51
- * Get the current project's unit type — the unit lengths are displayed and
52
- * entered in. Paired with {@linkcode PluginUnitsApi.setType}.
53
- *
54
- * @examplePrompt What units is this project using?
55
- * @examplePrompt Are we working in metric or imperial?
56
- * @examplePrompt Check the current measurement unit of the model
57
- * @examplePrompt Is the file set to millimetres or feet and inches?
58
- *
59
- * # Example
60
- * ```ts
61
- * const type = await snaptrude.core.units.getType()
62
- * console.log(type) // e.g. "millimeters"
63
- * ```
64
- */
65
- public abstract getType(): PluginApiReturn<PUnitType>
66
-
67
- /**
68
- * Set the current project's unit type. Paired with {@linkcode PluginUnitsApi.getType}.
69
- *
70
- * @param type - The unit type to set as the project unit.
71
- * @returns `true` if applied; `false` if `type` is not a settable project unit
72
- * (e.g. `kilometers`, `miles`, `babylon`).
73
- *
74
- * @examplePrompt Change the project units to millimeters
75
- * @examplePrompt Switch this model to feet and inches
76
- * @examplePrompt Set the working units to metric
77
- * @examplePrompt Make the drawing use centimetres instead of meters
78
- *
79
- * # Example
80
- * ```ts
81
- * await snaptrude.core.units.setType("meters")
82
- * ```
83
- */
84
- public abstract setType(type: PUnitType): PluginApiReturn<boolean>
85
-
86
- /**
87
- * Convert a value between two unit types.
88
- *
89
- * @param value - The numeric value to convert.
90
- * @param from - Source unit type.
91
- * @param to - Target unit type.
92
- * @param degree - (Optional) 1 = length, 2 = area, 3 = volume. Defaults to 1.
93
- * @returns The converted numeric value.
94
- *
95
- * @examplePrompt Convert 5 meters to feet and inches
96
- * @examplePrompt How many millimetres is 12 feet?
97
- * @examplePrompt Change this area from internal units to square metres
98
- * @examplePrompt Turn 2500 mm into meters
99
- * @examplePrompt Convert a volume value from babylon units to cubic feet
100
- *
101
- * # Example
102
- * ```ts
103
- * // 5 meters → internal babylon units
104
- * const b = await snaptrude.core.units.convert(5, "meters", "babylon")
105
- * // an internal area → square metres
106
- * const m2 = await snaptrude.core.units.convert(area, "babylon", "meters", 2)
107
- * ```
108
- */
109
- public abstract convert(
110
- value: number,
111
- from: PUnitType,
112
- to: PUnitType,
113
- degree?: number,
114
- ): PluginApiReturn<number>
115
- }
116
-
117
- /**
118
- * Supported unit types. `babylon` is Snaptrude's internal storage unit; the rest
119
- * are real-world units. Mirrors the engine `Converter.UNITS` vocabulary.
120
- */
121
- export const PUnitType = z.enum([
122
- "meters",
123
- "feet-inches",
124
- "inches",
125
- "centimeters",
126
- "millimeters",
127
- "kilometers",
128
- "miles",
129
- "babylon",
130
- ])
131
-
132
- export type PUnitType = z.infer<typeof PUnitType>
133
-
134
- /**
135
- * Arguments for {@linkcode PluginUnitsApi.setType}.
136
- *
137
- * | Property | Type | Description |
138
- * |---|---|---|
139
- * | `type` | {@linkcode PUnitType} | The unit type to set as the project unit |
140
- */
141
- export const PluginUnitsSetTypeArgs = z.object({
142
- type: PUnitType,
143
- })
144
-
145
- export type PluginUnitsSetTypeArgs = z.infer<typeof PluginUnitsSetTypeArgs>
146
-
147
- /**
148
- * Arguments for {@linkcode PluginUnitsApi.convert}.
149
- *
150
- * | Property | Type | Description |
151
- * |---|---|---|
152
- * | `value` | `number` | The numeric value to convert |
153
- * | `from` | {@linkcode PUnitType} | Source unit type |
154
- * | `to` | {@linkcode PUnitType} | Target unit type |
155
- * | `degree` | `1 \| 2 \| 3` | (Optional) 1 = length, 2 = area, 3 = volume. Defaults to 1 |
156
- */
157
- export const PluginUnitsConvertArgs = z.object({
158
- value: z.number(),
159
- from: PUnitType,
160
- to: PUnitType,
161
- degree: z.number().int().min(1).max(3).optional(),
162
- })
163
-
164
- export type PluginUnitsConvertArgs = z.infer<typeof PluginUnitsConvertArgs>
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../../types"
3
+
4
+ /**
5
+ * Unit-type queries and conversion.
6
+ *
7
+ * Snaptrude stores all geometry in an internal `babylon` unit. These methods
8
+ * read the available unit types, the internal (`babylon`) type, and the current
9
+ * project type; set the current project type; and convert values between any two
10
+ * unit types.
11
+ *
12
+ * Accessed via `snaptrude.core.units`.
13
+ */
14
+ export abstract class PluginUnitsApi {
15
+ constructor() {}
16
+
17
+ /**
18
+ * List the selectable real-world unit types (excludes the internal `babylon`
19
+ * storage type, which is read via {@linkcode PluginUnitsApi.getBabylonType}).
20
+ *
21
+ * @examplePrompt What units can I use in this project?
22
+ * @examplePrompt List all the available measurement units
23
+ * @examplePrompt Which unit systems does Snaptrude support?
24
+ * @examplePrompt Show the unit options I could switch the model to
25
+ *
26
+ * # Example
27
+ * ```ts
28
+ * const types = await snaptrude.core.units.listTypes()
29
+ * console.log(types) // ["meters", "feet-inches", "inches", ...]
30
+ * ```
31
+ */
32
+ public abstract listTypes(): PluginApiReturn<PUnitType[]>
33
+
34
+ /**
35
+ * Get the internal storage unit type that all geometry is kept in — always
36
+ * `"babylon"` — for use as one side of a {@linkcode PluginUnitsApi.convert} call.
37
+ *
38
+ * @examplePrompt What unit does Snaptrude store geometry in internally?
39
+ * @examplePrompt Get the internal babylon unit type
40
+ * @examplePrompt Which unit are raw model coordinates saved in?
41
+ *
42
+ * # Example
43
+ * ```ts
44
+ * const babylon = await snaptrude.core.units.getBabylonType() // "babylon"
45
+ * const meters = await snaptrude.core.units.convert(10, babylon, "meters")
46
+ * ```
47
+ */
48
+ public abstract getBabylonType(): PluginApiReturn<PUnitType>
49
+
50
+ /**
51
+ * Get the current project's unit type — the unit lengths are displayed and
52
+ * entered in. Paired with {@linkcode PluginUnitsApi.setType}.
53
+ *
54
+ * @examplePrompt What units is this project using?
55
+ * @examplePrompt Are we working in metric or imperial?
56
+ * @examplePrompt Check the current measurement unit of the model
57
+ * @examplePrompt Is the file set to millimetres or feet and inches?
58
+ *
59
+ * # Example
60
+ * ```ts
61
+ * const type = await snaptrude.core.units.getType()
62
+ * console.log(type) // e.g. "millimeters"
63
+ * ```
64
+ */
65
+ public abstract getType(): PluginApiReturn<PUnitType>
66
+
67
+ /**
68
+ * Set the current project's unit type. Paired with {@linkcode PluginUnitsApi.getType}.
69
+ *
70
+ * @param type - The unit type to set as the project unit.
71
+ * @returns `true` if applied; `false` if `type` is not a settable project unit
72
+ * (e.g. `kilometers`, `miles`, `babylon`).
73
+ *
74
+ * @examplePrompt Change the project units to millimeters
75
+ * @examplePrompt Switch this model to feet and inches
76
+ * @examplePrompt Set the working units to metric
77
+ * @examplePrompt Make the drawing use centimetres instead of meters
78
+ *
79
+ * # Example
80
+ * ```ts
81
+ * await snaptrude.core.units.setType("meters")
82
+ * ```
83
+ */
84
+ public abstract setType(type: PUnitType): PluginApiReturn<boolean>
85
+
86
+ /**
87
+ * Convert a value between two unit types.
88
+ *
89
+ * @param value - The numeric value to convert.
90
+ * @param from - Source unit type.
91
+ * @param to - Target unit type.
92
+ * @param degree - (Optional) 1 = length, 2 = area, 3 = volume. Defaults to 1.
93
+ * @returns The converted numeric value.
94
+ *
95
+ * @examplePrompt Convert 5 meters to feet and inches
96
+ * @examplePrompt How many millimetres is 12 feet?
97
+ * @examplePrompt Change this area from internal units to square metres
98
+ * @examplePrompt Turn 2500 mm into meters
99
+ * @examplePrompt Convert a volume value from babylon units to cubic feet
100
+ *
101
+ * # Example
102
+ * ```ts
103
+ * // 5 meters → internal babylon units
104
+ * const b = await snaptrude.core.units.convert(5, "meters", "babylon")
105
+ * // an internal area → square metres
106
+ * const m2 = await snaptrude.core.units.convert(area, "babylon", "meters", 2)
107
+ * ```
108
+ */
109
+ public abstract convert(
110
+ value: number,
111
+ from: PUnitType,
112
+ to: PUnitType,
113
+ degree?: number,
114
+ ): PluginApiReturn<number>
115
+ }
116
+
117
+ /**
118
+ * Supported unit types. `babylon` is Snaptrude's internal storage unit; the rest
119
+ * are real-world units. Mirrors the engine `Converter.UNITS` vocabulary.
120
+ */
121
+ export const PUnitType = z.enum([
122
+ "meters",
123
+ "feet-inches",
124
+ "inches",
125
+ "centimeters",
126
+ "millimeters",
127
+ "kilometers",
128
+ "miles",
129
+ "babylon",
130
+ ])
131
+
132
+ export type PUnitType = z.infer<typeof PUnitType>
133
+
134
+ /**
135
+ * Arguments for {@linkcode PluginUnitsApi.setType}.
136
+ *
137
+ * | Property | Type | Description |
138
+ * |---|---|---|
139
+ * | `type` | {@linkcode PUnitType} | The unit type to set as the project unit |
140
+ */
141
+ export const PluginUnitsSetTypeArgs = z.object({
142
+ type: PUnitType,
143
+ })
144
+
145
+ export type PluginUnitsSetTypeArgs = z.infer<typeof PluginUnitsSetTypeArgs>
146
+
147
+ /**
148
+ * Arguments for {@linkcode PluginUnitsApi.convert}.
149
+ *
150
+ * | Property | Type | Description |
151
+ * |---|---|---|
152
+ * | `value` | `number` | The numeric value to convert |
153
+ * | `from` | {@linkcode PUnitType} | Source unit type |
154
+ * | `to` | {@linkcode PUnitType} | Target unit type |
155
+ * | `degree` | `1 \| 2 \| 3` | (Optional) 1 = length, 2 = area, 3 = volume. Defaults to 1 |
156
+ */
157
+ export const PluginUnitsConvertArgs = z.object({
158
+ value: z.number(),
159
+ from: PUnitType,
160
+ to: PUnitType,
161
+ degree: z.number().int().min(1).max(3).optional(),
162
+ })
163
+
164
+ export type PluginUnitsConvertArgs = z.infer<typeof PluginUnitsConvertArgs>
@@ -1,46 +1,46 @@
1
- import * as z from "zod"
2
- import { PluginApiReturn } from "../../types"
3
-
4
- /**
5
- * User locale.
6
- *
7
- * Read the viewer's timezone and language — for date/number formatting and
8
- * localized labels. This is locale only: NO precise geolocation, no IP, no
9
- * account identity. Accessed via `snaptrude.core.user`.
10
- */
11
- export abstract class PluginUserApi {
12
- constructor() {}
13
-
14
- /**
15
- * Get the viewer's locale: IANA timezone and BCP-47 language tag, resolved
16
- * from the browser (`Intl.DateTimeFormat().resolvedOptions().timeZone` and
17
- * `navigator.language`). Locale only — no precise location.
18
- *
19
- * @returns `{ timezone, language }` — e.g. `{ timezone: "Asia/Kolkata", language: "en-US" }`.
20
- *
21
- * @examplePrompt What timezone is the user in?
22
- * @examplePrompt Get the viewer's language for localized labels
23
- * @examplePrompt Format the report date in the user's local timezone
24
- * @examplePrompt Which locale should I use for this plugin's UI?
25
- *
26
- * # Example
27
- * ```ts
28
- * const { timezone, language } = await snaptrude.core.user.getLocale()
29
- * ```
30
- */
31
- public abstract getLocale(): PluginApiReturn<PluginUserLocale>
32
- }
33
-
34
- /**
35
- * The viewer's locale.
36
- *
37
- * | Property | Type | Description |
38
- * |---|---|---|
39
- * | `timezone` | `string` | IANA timezone id (e.g. `"Asia/Kolkata"`) |
40
- * | `language` | `string` | BCP-47 language tag (e.g. `"en-US"`) |
41
- */
42
- export const PluginUserLocale = z.object({
43
- timezone: z.string(),
44
- language: z.string(),
45
- })
46
- export type PluginUserLocale = z.infer<typeof PluginUserLocale>
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../types"
3
+
4
+ /**
5
+ * User locale.
6
+ *
7
+ * Read the viewer's timezone and language — for date/number formatting and
8
+ * localized labels. This is locale only: NO precise geolocation, no IP, no
9
+ * account identity. Accessed via `snaptrude.core.user`.
10
+ */
11
+ export abstract class PluginUserApi {
12
+ constructor() {}
13
+
14
+ /**
15
+ * Get the viewer's locale: IANA timezone and BCP-47 language tag, resolved
16
+ * from the browser (`Intl.DateTimeFormat().resolvedOptions().timeZone` and
17
+ * `navigator.language`). Locale only — no precise location.
18
+ *
19
+ * @returns `{ timezone, language }` — e.g. `{ timezone: "Asia/Kolkata", language: "en-US" }`.
20
+ *
21
+ * @examplePrompt What timezone is the user in?
22
+ * @examplePrompt Get the viewer's language for localized labels
23
+ * @examplePrompt Format the report date in the user's local timezone
24
+ * @examplePrompt Which locale should I use for this plugin's UI?
25
+ *
26
+ * # Example
27
+ * ```ts
28
+ * const { timezone, language } = await snaptrude.core.user.getLocale()
29
+ * ```
30
+ */
31
+ public abstract getLocale(): PluginApiReturn<PluginUserLocale>
32
+ }
33
+
34
+ /**
35
+ * The viewer's locale.
36
+ *
37
+ * | Property | Type | Description |
38
+ * |---|---|---|
39
+ * | `timezone` | `string` | IANA timezone id (e.g. `"Asia/Kolkata"`) |
40
+ * | `language` | `string` | BCP-47 language tag (e.g. `"en-US"`) |
41
+ */
42
+ export const PluginUserLocale = z.object({
43
+ timezone: z.string(),
44
+ language: z.string(),
45
+ })
46
+ export type PluginUserLocale = z.infer<typeof PluginUserLocale>
@@ -1,51 +1,64 @@
1
- import { PluginApiReturn } from "../../../types"
2
-
3
- /**
4
- * Camera zoom controls.
5
- *
6
- * Frame the viewport camera onto scene geometry — mirrors the canvas zoom menu
7
- * ("Zoom extents" / "Zoom to selection"). Accessed via `snaptrude.core.zoom`.
8
- */
9
- export abstract class PluginZoomApi {
10
- constructor() {}
11
-
12
- /**
13
- * Zoom (fit) the camera to all geometry in the scene — the "zoom extents" action.
14
- *
15
- * @returns `true` once the camera has been framed to the scene.
16
- *
17
- * @examplePrompt Zoom out so I can see the whole model
18
- * @examplePrompt Fit everything in the view
19
- * @examplePrompt Frame the entire building in the viewport
20
- * @examplePrompt Do a zoom extents on the canvas
21
- * @examplePrompt Show me the full scene
22
- *
23
- * # Example
24
- * ```ts
25
- * await snaptrude.core.zoom.extents()
26
- * ```
27
- *
28
- * @deprecated Use `core.camera.zoomExtents`
29
- */
30
- public abstract extents(): PluginApiReturn<boolean>
31
-
32
- /**
33
- * Zoom (fit) the camera to the current selection.
34
- *
35
- * @returns `true` if there was a selection to frame; `false` if nothing is
36
- * selected (no-op).
37
- *
38
- * @examplePrompt Zoom in on what I have selected
39
- * @examplePrompt Frame the selected walls in the view
40
- * @examplePrompt Focus the camera on my current selection
41
- * @examplePrompt Fit the view to the selected room
42
- *
43
- * # Example
44
- * ```ts
45
- * await snaptrude.core.zoom.selection()
46
- * ```
47
- *
48
- * @deprecated Use `core.camera.zoomSelection`
49
- */
50
- public abstract selection(): PluginApiReturn<boolean>
51
- }
1
+ import { PluginApiReturn } from "../../../types"
2
+
3
+ /**
4
+ * Camera zoom controls.
5
+ *
6
+ * Frame the viewport camera onto scene geometry — mirrors the canvas zoom menu
7
+ * ("Zoom extents" / "Zoom to selection"). Accessed via `snaptrude.core.zoom`.
8
+ *
9
+ * While Present mode is open these calls set the Design frame a view saved in
10
+ * Present (`presentation.views.create`) is taken from; they never move the
11
+ * Present sheet canvas. To pan, zoom or screenshot the Present canvas, use
12
+ * {@linkcode PluginPresentationCameraApi} (`presentation.camera`).
13
+ */
14
+ export abstract class PluginZoomApi {
15
+ constructor() {}
16
+
17
+ /**
18
+ * Zoom (fit) the camera to all geometry in the scene — the "zoom extents" action.
19
+ *
20
+ * While Present is open this sets the Design frame a view saved in Present
21
+ * is taken from; it never moves the Present sheet canvas; use
22
+ * `presentation.camera` for that.
23
+ *
24
+ * @returns `true` once the camera has been framed to the scene.
25
+ *
26
+ * @examplePrompt Zoom out so I can see the whole model
27
+ * @examplePrompt Fit everything in the view
28
+ * @examplePrompt Frame the entire building in the viewport
29
+ * @examplePrompt Do a zoom extents on the canvas
30
+ * @examplePrompt Show me the full scene
31
+ *
32
+ * # Example
33
+ * ```ts
34
+ * await snaptrude.core.zoom.extents()
35
+ * ```
36
+ *
37
+ * @deprecated Use `core.camera.zoomExtents`
38
+ */
39
+ public abstract extents(): PluginApiReturn<boolean>
40
+
41
+ /**
42
+ * Zoom (fit) the camera to the current selection.
43
+ *
44
+ * While Present is open this sets the Design frame a view saved in Present
45
+ * is taken from; it never moves the Present sheet canvas; use
46
+ * `presentation.camera` for that.
47
+ *
48
+ * @returns `true` if there was a selection to frame; `false` if nothing is
49
+ * selected (no-op).
50
+ *
51
+ * @examplePrompt Zoom in on what I have selected
52
+ * @examplePrompt Frame the selected walls in the view
53
+ * @examplePrompt Focus the camera on my current selection
54
+ * @examplePrompt Fit the view to the selected room
55
+ *
56
+ * # Example
57
+ * ```ts
58
+ * await snaptrude.core.zoom.selection()
59
+ * ```
60
+ *
61
+ * @deprecated Use `core.camera.zoomSelection`
62
+ */
63
+ public abstract selection(): PluginApiReturn<boolean>
64
+ }
@@ -0,0 +1,121 @@
1
+ import * as z from "zod"
2
+ import { ComponentHandle } from "../../handles"
3
+ import type { PluginApiReturn } from "../../types"
4
+ import { PluginConstructionType, PluginFamilyValues } from "./catalog"
5
+ import { PluginFamilyBundleSchema } from "./family"
6
+
7
+ const id = z.string().min(1).max(300)
8
+ const spaces = z.array(ComponentHandle).min(1).max(1000)
9
+
10
+ /** Read scope. Omit spaces to inspect the active proposal's sketch spaces. */
11
+ export const PluginBimContextArgs = z.object({ spaces: spaces.optional() }).strict()
12
+ export type PluginBimContextArgs = z.infer<typeof PluginBimContextArgs>
13
+
14
+ /** Directed graph edge. Side A lies along world-up × curve-direction; side B is opposite.
15
+ * Region IDs are snapshot identifiers, not component handles. Null means no adjacent region.
16
+ */
17
+ export const PluginBimEdge = z.object({
18
+ id,
19
+ startMm: z.tuple([z.number(), z.number(), z.number()]),
20
+ endMm: z.tuple([z.number(), z.number(), z.number()]),
21
+ lengthMm: z.number(),
22
+ heightMm: z.number(),
23
+ sideA: id.nullable(),
24
+ sideB: id.nullable(),
25
+ wall: ComponentHandle.nullable(),
26
+ supported: z.boolean(),
27
+ })
28
+ export type PluginBimEdge = z.infer<typeof PluginBimEdge>
29
+
30
+ /** Construction context is detached. Revision covers geometry, room metadata and construction state. */
31
+ export const PluginBimContext = z.object({
32
+ revision: id,
33
+ proposalId: id,
34
+ units: z.literal("mm"),
35
+ spaces: z.array(z.object({
36
+ component: ComponentHandle,
37
+ label: z.string(),
38
+ storey: z.number(),
39
+ eligible: z.boolean(),
40
+ reason: z.string().optional(),
41
+ })),
42
+ regions: z.array(z.object({ id, spaces: z.array(ComponentHandle) })),
43
+ edges: z.array(PluginBimEdge),
44
+ })
45
+ export type PluginBimContext = z.infer<typeof PluginBimContext>
46
+
47
+ /** Plan-local key selects either an existing construction or a new project-only native recipe.
48
+ * Bundles use the native DSL's SU/unit-expression rules; values overrides use mm/degrees.
49
+ */
50
+ export const PluginBimConstruction = z.union([
51
+ z.object({ key: id, reference: PluginConstructionType }).strict(),
52
+ z.object({ key: id, bundle: PluginFamilyBundleSchema }).strict(),
53
+ ])
54
+ export type PluginBimConstruction = z.infer<typeof PluginBimConstruction>
55
+
56
+ /** Every unwalled edge in the selected scope needs exactly one assignment.
57
+ * The first authored layer faces sideA unless reversed. Alignment sets the initial core-centre offset.
58
+ * Later parameter edits preserve the offset and reject invalid core alignment.
59
+ */
60
+ export const PluginBimWallAssignment = z.object({
61
+ edgeId: id,
62
+ construction: id,
63
+ values: PluginFamilyValues.optional(),
64
+ reversed: z.boolean(),
65
+ alignment: z.literal("coreCentre"),
66
+ }).strict()
67
+ export type PluginBimWallAssignment = z.infer<typeof PluginBimWallAssignment>
68
+
69
+ export const PluginBimPrepareArgs = z.object({
70
+ revision: id,
71
+ spaces,
72
+ constructions: z.array(PluginBimConstruction).max(1000),
73
+ walls: z.array(PluginBimWallAssignment).max(10000),
74
+ }).strict()
75
+ export type PluginBimPrepareArgs = z.infer<typeof PluginBimPrepareArgs>
76
+
77
+ /** Expected recipe/plan failures are diagnostics. No scene or library change occurs during prepare. */
78
+ export const PluginBimPreparation = z.object({
79
+ ok: z.boolean(),
80
+ preparationId: id.optional(),
81
+ diagnostics: z.array(z.object({ path: z.string(), message: z.string() })),
82
+ })
83
+ export type PluginBimPreparation = z.infer<typeof PluginBimPreparation>
84
+ export const PluginBimCreateArgs = z.object({ preparationId: id }).strict()
85
+
86
+ /** Source IDs identify removed sketch spaces, not live handles. Successful storeys share one undo step.
87
+ * Failed storeys remain spaces. Cancellation rolls back the whole conversion. Persistence is queued
88
+ * through normal model commands; this result is not a durable server-save acknowledgement.
89
+ */
90
+ export const PluginBimResult = z.object({
91
+ status: z.enum(["created", "partial", "cancelled", "unchanged"]),
92
+ convertedSpaceIds: z.array(z.string()),
93
+ created: z.array(ComponentHandle),
94
+ kept: z.array(z.object({ space: ComponentHandle, reason: z.string() })),
95
+ })
96
+ export type PluginBimResult = z.infer<typeof PluginBimResult>
97
+
98
+ /** Agent-driven Sketch-to-BIM. Uses PG2 topology; never redraws routes or publishes library families. */
99
+ export abstract class PluginDesignBimApi {
100
+ /** Read room adjacency and native conversion eligibility in the active proposal.
101
+ * @param options Optional explicit spaces; filters edges but keeps adjacent room metadata.
102
+ * @returns Rooms, directed boundaries in mm, eligibility and revision.
103
+ * @examplePrompt Inspect the rooms on each side of these sketch wall boundaries
104
+ */
105
+ abstract getContext(options?: PluginBimContextArgs): PluginApiReturn<PluginBimContext>
106
+
107
+ /** Stage a complete wall-construction assignment. A new prepare replaces this plugin's prior plan.
108
+ * @param plan Exact context revision, selected spaces, constructions and edge assignments.
109
+ * @returns Diagnostics or an opaque preparation ID, scoped to the caller and current project.
110
+ * @examplePrompt Validate wall layer assignments before converting sketch rooms to BIM
111
+ */
112
+ abstract prepare(plan: PluginBimPrepareArgs): PluginApiReturn<PluginBimPreparation>
113
+
114
+ /** Execute native Sketch-to-BIM. Revalidates scope, catalogue access and construction before mutation.
115
+ * Uses native progress/cancel controls and worker cancellation. Floors/roofs retain project defaults.
116
+ * @param preparationId ID returned by prepare. Consumed once; stale or foreign IDs throw PRECONDITION_FAILED.
117
+ * @returns Created component handles and explicit converted/kept outcomes, including partial success.
118
+ * @examplePrompt Convert these sketch rooms to BIM with wall layers chosen for each room boundary
119
+ */
120
+ abstract create(preparationId: string): PluginApiReturn<PluginBimResult>
121
+ }