@snaptrude/plugin-core 0.11.0-rc.1 → 1.0.0

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 (226) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +176 -14
  3. package/api-manifest.json +872 -49
  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 +447 -0
  7. package/dist/api/core/camera/index.d.ts.map +1 -1
  8. package/dist/api/core/geom/create/index.d.ts +942 -101
  9. package/dist/api/core/geom/create/index.d.ts.map +1 -1
  10. package/dist/api/core/geom/query/brep.d.ts +59 -2
  11. package/dist/api/core/geom/query/brep.d.ts.map +1 -1
  12. package/dist/api/core/geom/query/curve.d.ts +59 -35
  13. package/dist/api/core/geom/query/curve.d.ts.map +1 -1
  14. package/dist/api/core/geom/query/edge.d.ts +2 -2
  15. package/dist/api/core/geom/query/face.d.ts +105 -0
  16. package/dist/api/core/geom/query/face.d.ts.map +1 -1
  17. package/dist/api/core/geom/update/contour.d.ts +10 -2
  18. package/dist/api/core/geom/update/contour.d.ts.map +1 -1
  19. package/dist/api/core/geom/update/curve.d.ts +5 -5
  20. package/dist/api/core/geom/update/profile.d.ts +3 -1
  21. package/dist/api/core/geom/update/profile.d.ts.map +1 -1
  22. package/dist/api/core/handles/index.d.ts +4 -2
  23. package/dist/api/core/handles/index.d.ts.map +1 -1
  24. package/dist/api/core/index.d.ts +4 -4
  25. package/dist/api/core/index.d.ts.map +1 -1
  26. package/dist/api/core/io/import/index.d.ts +3 -1
  27. package/dist/api/core/io/import/index.d.ts.map +1 -1
  28. package/dist/api/core/layers.d.ts +377 -255
  29. package/dist/api/core/layers.d.ts.map +1 -1
  30. package/dist/api/core/mode/index.d.ts +19 -7
  31. package/dist/api/core/mode/index.d.ts.map +1 -1
  32. package/dist/api/core/proposals/index.d.ts +4 -3
  33. package/dist/api/core/proposals/index.d.ts.map +1 -1
  34. package/dist/api/core/storeys/index.d.ts +17 -2
  35. package/dist/api/core/storeys/index.d.ts.map +1 -1
  36. package/dist/api/core/storeys/layers.d.ts +408 -0
  37. package/dist/api/core/storeys/layers.d.ts.map +1 -0
  38. package/dist/api/core/tags.d.ts +84 -3
  39. package/dist/api/core/tags.d.ts.map +1 -1
  40. package/dist/api/core/zoom/index.d.ts +13 -0
  41. package/dist/api/core/zoom/index.d.ts.map +1 -1
  42. package/dist/api/design/bim.d.ts +299 -0
  43. package/dist/api/design/bim.d.ts.map +1 -0
  44. package/dist/api/design/boolean/index.d.ts +2 -0
  45. package/dist/api/design/boolean/index.d.ts.map +1 -1
  46. package/dist/api/design/catalog.d.ts +320 -0
  47. package/dist/api/design/catalog.d.ts.map +1 -0
  48. package/dist/api/design/create/bulk-items.d.ts +269 -0
  49. package/dist/api/design/create/bulk-items.d.ts.map +1 -0
  50. package/dist/api/design/create/grids.d.ts +132 -0
  51. package/dist/api/design/create/grids.d.ts.map +1 -0
  52. package/dist/api/design/create/index.d.ts +753 -102
  53. package/dist/api/design/create/index.d.ts.map +1 -1
  54. package/dist/api/design/create/opening-fields.d.ts +38 -0
  55. package/dist/api/design/create/opening-fields.d.ts.map +1 -0
  56. package/dist/api/design/delete/index.d.ts +7 -20
  57. package/dist/api/design/delete/index.d.ts.map +1 -1
  58. package/dist/api/design/dimensions.d.ts +427 -0
  59. package/dist/api/design/dimensions.d.ts.map +1 -0
  60. package/dist/api/design/doors/index.d.ts +24 -23
  61. package/dist/api/design/doors/index.d.ts.map +1 -1
  62. package/dist/api/design/family.d.ts +1446 -0
  63. package/dist/api/design/family.d.ts.map +1 -0
  64. package/dist/api/design/grids.d.ts +237 -0
  65. package/dist/api/design/grids.d.ts.map +1 -0
  66. package/dist/api/design/index.d.ts +30 -0
  67. package/dist/api/design/index.d.ts.map +1 -1
  68. package/dist/api/design/networks.d.ts +1703 -0
  69. package/dist/api/design/networks.d.ts.map +1 -0
  70. package/dist/api/design/query/geometry/index.d.ts +33 -5
  71. package/dist/api/design/query/geometry/index.d.ts.map +1 -1
  72. package/dist/api/design/query/grids.d.ts +287 -0
  73. package/dist/api/design/query/grids.d.ts.map +1 -0
  74. package/dist/api/design/query/index.d.ts +143 -36
  75. package/dist/api/design/query/index.d.ts.map +1 -1
  76. package/dist/api/design/query/spaces.d.ts +5 -66
  77. package/dist/api/design/query/spaces.d.ts.map +1 -1
  78. package/dist/api/design/selection/index.d.ts +12 -12
  79. package/dist/api/design/types/index.d.ts +40 -24
  80. package/dist/api/design/types/index.d.ts.map +1 -1
  81. package/dist/api/design/update/index.d.ts +412 -8
  82. package/dist/api/design/update/index.d.ts.map +1 -1
  83. package/dist/api/design/windows/index.d.ts +8 -8
  84. package/dist/api/design/windows/index.d.ts.map +1 -1
  85. package/dist/api/entity/buildableEnvelope.d.ts +84 -2
  86. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
  87. package/dist/api/entity/referenceLine.d.ts +13 -1
  88. package/dist/api/entity/referenceLine.d.ts.map +1 -1
  89. package/dist/api/entity/space.d.ts +12 -15
  90. package/dist/api/entity/space.d.ts.map +1 -1
  91. package/dist/api/entity/story.d.ts +4 -4
  92. package/dist/api/presentation/aiInspiration.d.ts +24 -24
  93. package/dist/api/presentation/annotate.d.ts +38 -22
  94. package/dist/api/presentation/annotate.d.ts.map +1 -1
  95. package/dist/api/presentation/camera.d.ts +265 -0
  96. package/dist/api/presentation/camera.d.ts.map +1 -0
  97. package/dist/api/presentation/drawingContract.d.ts +32 -0
  98. package/dist/api/presentation/drawingContract.d.ts.map +1 -0
  99. package/dist/api/presentation/drawings.d.ts +3523 -0
  100. package/dist/api/presentation/drawings.d.ts.map +1 -0
  101. package/dist/api/presentation/export.d.ts +23 -5
  102. package/dist/api/presentation/export.d.ts.map +1 -1
  103. package/dist/api/presentation/graphics.d.ts +419 -0
  104. package/dist/api/presentation/graphics.d.ts.map +1 -0
  105. package/dist/api/presentation/index.d.ts +66 -12
  106. package/dist/api/presentation/index.d.ts.map +1 -1
  107. package/dist/api/presentation/placedViews.d.ts +117 -51
  108. package/dist/api/presentation/placedViews.d.ts.map +1 -1
  109. package/dist/api/presentation/sections.d.ts +461 -0
  110. package/dist/api/presentation/sections.d.ts.map +1 -0
  111. package/dist/api/presentation/shapes.d.ts +2 -2
  112. package/dist/api/presentation/sheets.d.ts +175 -37
  113. package/dist/api/presentation/sheets.d.ts.map +1 -1
  114. package/dist/api/presentation/standards.d.ts +590 -0
  115. package/dist/api/presentation/standards.d.ts.map +1 -0
  116. package/dist/api/presentation/viewPresets.d.ts +222 -0
  117. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  118. package/dist/api/presentation/views.d.ts +144 -9
  119. package/dist/api/presentation/views.d.ts.map +1 -1
  120. package/dist/api/presentation/walkthroughs.d.ts +1350 -0
  121. package/dist/api/presentation/walkthroughs.d.ts.map +1 -0
  122. package/dist/api/program/departments.d.ts +58 -2
  123. package/dist/api/program/departments.d.ts.map +1 -1
  124. package/dist/api/program/index.d.ts +16 -6
  125. package/dist/api/program/index.d.ts.map +1 -1
  126. package/dist/api/program/labels.d.ts +355 -0
  127. package/dist/api/program/labels.d.ts.map +1 -0
  128. package/dist/api/program/metadata.d.ts +328 -0
  129. package/dist/api/program/metadata.d.ts.map +1 -0
  130. package/dist/api/program/site.d.ts +4 -4
  131. package/dist/api/program/spreadsheet.d.ts +267 -4
  132. package/dist/api/program/spreadsheet.d.ts.map +1 -1
  133. package/dist/api/workspace/index.d.ts +49 -2
  134. package/dist/api/workspace/index.d.ts.map +1 -1
  135. package/dist/errors/codes.d.ts +5 -8
  136. package/dist/errors/codes.d.ts.map +1 -1
  137. package/dist/handles.d.ts +32 -3
  138. package/dist/handles.d.ts.map +1 -1
  139. package/dist/index.cjs +6534 -2865
  140. package/dist/index.cjs.map +1 -1
  141. package/dist/index.d.ts +2 -0
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +6118 -2857
  144. package/dist/index.js.map +1 -1
  145. package/dist/massParameters.d.ts +287 -0
  146. package/dist/massParameters.d.ts.map +1 -0
  147. package/dist/massParameters.ops.d.ts +138 -0
  148. package/dist/massParameters.ops.d.ts.map +1 -0
  149. package/package.json +2 -1
  150. package/scripts/check-dist-fresh.mjs +22 -0
  151. package/scripts/generate-manifest.mjs +5 -0
  152. package/scripts/generate-manifest.test.mjs +14 -3
  153. package/src/api/core/camera/index.ts +429 -1
  154. package/src/api/core/geom/create/index.ts +1037 -102
  155. package/src/api/core/geom/query/brep.ts +60 -2
  156. package/src/api/core/geom/query/curve.ts +26 -2
  157. package/src/api/core/geom/query/edge.ts +2 -2
  158. package/src/api/core/geom/query/face.ts +109 -4
  159. package/src/api/core/geom/update/contour.ts +10 -2
  160. package/src/api/core/geom/update/profile.ts +2 -0
  161. package/src/api/core/handles/index.ts +3 -2
  162. package/src/api/core/index.ts +4 -4
  163. package/src/api/core/io/import/index.ts +11 -3
  164. package/src/api/core/layers.ts +380 -173
  165. package/src/api/core/mode/index.ts +19 -7
  166. package/src/api/core/proposals/index.ts +4 -3
  167. package/src/api/core/storeys/index.ts +19 -2
  168. package/src/api/core/storeys/layers.ts +339 -0
  169. package/src/api/core/tags.ts +76 -0
  170. package/src/api/core/zoom/index.ts +13 -0
  171. package/src/api/design/bim.ts +210 -0
  172. package/src/api/design/boolean/index.ts +2 -0
  173. package/src/api/design/catalog.ts +203 -0
  174. package/src/api/design/create/bulk-items.ts +294 -0
  175. package/src/api/design/create/grids.ts +137 -0
  176. package/src/api/design/create/index.ts +824 -141
  177. package/src/api/design/create/opening-fields.ts +40 -0
  178. package/src/api/design/delete/index.ts +6 -20
  179. package/src/api/design/dimensions.ts +453 -0
  180. package/src/api/design/doors/index.ts +64 -41
  181. package/src/api/design/family.ts +1342 -0
  182. package/src/api/design/grids.ts +237 -0
  183. package/src/api/design/index.ts +49 -4
  184. package/src/api/design/networks.ts +607 -0
  185. package/src/api/design/query/geometry/index.ts +35 -4
  186. package/src/api/design/query/grids.ts +197 -0
  187. package/src/api/design/query/index.ts +105 -5
  188. package/src/api/design/query/spaces.ts +0 -68
  189. package/src/api/design/types/index.ts +31 -24
  190. package/src/api/design/update/index.ts +398 -4
  191. package/src/api/design/windows/index.ts +40 -22
  192. package/src/api/entity/buildableEnvelope.ts +77 -2
  193. package/src/api/entity/referenceLine.ts +25 -12
  194. package/src/api/entity/space.ts +0 -2
  195. package/src/api/presentation/annotate.ts +90 -58
  196. package/src/api/presentation/camera.ts +289 -0
  197. package/src/api/presentation/drawingContract.ts +70 -0
  198. package/src/api/presentation/drawings.ts +1179 -0
  199. package/src/api/presentation/export.ts +32 -6
  200. package/src/api/presentation/graphics.ts +324 -0
  201. package/src/api/presentation/index.ts +73 -14
  202. package/src/api/presentation/placedViews.ts +120 -57
  203. package/src/api/presentation/sections.ts +420 -0
  204. package/src/api/presentation/sheets.ts +182 -37
  205. package/src/api/presentation/standards.ts +445 -0
  206. package/src/api/presentation/viewPresets.ts +241 -0
  207. package/src/api/presentation/views.ts +81 -10
  208. package/src/api/presentation/walkthroughs.ts +1201 -0
  209. package/src/api/program/departments.ts +54 -2
  210. package/src/api/program/index.ts +16 -6
  211. package/src/api/program/labels.ts +332 -0
  212. package/src/api/program/metadata.ts +364 -0
  213. package/src/api/program/spreadsheet.ts +282 -0
  214. package/src/api/workspace/index.ts +51 -2
  215. package/src/errors/codes.ts +9 -30
  216. package/src/handles.ts +42 -3
  217. package/src/index.ts +2 -0
  218. package/src/massParameters.ops.ts +246 -0
  219. package/src/massParameters.ts +427 -0
  220. package/test/drawingContract.test.mjs +288 -0
  221. package/test/errors.test.mjs +1 -4
  222. package/test/massParameters.test.mjs +952 -0
  223. package/test/paperPensContract.test.mjs +75 -0
  224. package/test/presentationViewSettings.test.mjs +85 -0
  225. package/api-manifest.full.json +0 -6928
  226. package/snaptrude-plugin-core-0.11.0.tgz +0 -0
@@ -1,5 +1,9 @@
1
1
  import * as z from "zod"
2
2
  import { PluginApiReturn } from "../../types"
3
+ import {
4
+ PluginProgramSiteEdgeRole,
5
+ PluginProgramSiteEdgesEntry,
6
+ } from "../program/site"
3
7
 
4
8
  /**
5
9
  * Buildable Envelope management — create and update parametric zoning envelopes.
@@ -72,6 +76,11 @@ export abstract class PluginBuildableEnvelopeApi {
72
76
  * volume from a revised site polygon, setbacks, vertical cap, or FAR and
73
77
  * lot-coverage limits, keeping the same envelope id.
74
78
  *
79
+ * Edge state is preserved, like the right panel: every edge's type
80
+ * (front/side/rear) is kept. For each type whose value changed (by more than
81
+ * 2 mm), the per-edge custom distances on edges of that type are cleared;
82
+ * custom distances on types whose value did not change are kept.
83
+ *
75
84
  * @param buildableEnvelopeId - Existing envelope ID to update; non-empty and
76
85
  * must match an existing envelope on the canvas.
77
86
  * @param sitePolygon - Site polygon vertices in `lengthUnit`; minimum 3 vertices.
@@ -82,9 +91,15 @@ export abstract class PluginBuildableEnvelopeApi {
82
91
  * @param farRatio - Optional FAR value, positive when provided.
83
92
  * @param lotCoverageMaxPct - Optional lot coverage cap, `0..100`.
84
93
  * @returns A {@linkcode PluginBuildableEnvelopeUpdateResult} with the
85
- * `buildableEnvelopeId` of the updated envelope.
94
+ * `buildableEnvelopeId` of the updated envelope and `clearedEdgeSetbacks`,
95
+ * the `edgeIndex` of each edge that lost its custom distance (empty when
96
+ * none). Tell the user about any cleared edges.
86
97
  * @throws If validation fails, the envelope does not exist, or generation
87
- * produces no renderable geometry.
98
+ * produces no renderable geometry. Also throws `PRECONDITION_FAILED`
99
+ * (`details.reason: "STALE_EDGE_SETTINGS"`, nothing changes) when the site
100
+ * outline changed since the edge settings were made. Tell the user;
101
+ * editing any edge on the canvas setback pills resets the edge settings
102
+ * to the new outline (dropping the old ones), after which you can retry.
88
103
  *
89
104
  * @examplePrompt Change the envelope's height limit to 175 feet
90
105
  * @examplePrompt Update the setbacks on the buildable envelope
@@ -312,11 +327,71 @@ export type PluginBuildableEnvelopeUpdateArgs = z.infer<
312
327
  * | Property | Type | Description |
313
328
  * |---|---|---|
314
329
  * | `buildableEnvelopeId` | `string` | Non-empty unique ID of the updated buildable envelope |
330
+ * | `clearedEdgeSetbacks` | `number[]` | `edgeIndex` of every edge whose own custom distance was cleared because its type's (front/side/rear) value changed; empty when none |
315
331
  */
316
332
  export const PluginBuildableEnvelopeUpdateResult = z.object({
317
333
  buildableEnvelopeId: z.string().min(1),
334
+ clearedEdgeSetbacks: z.array(z.number().int().nonnegative()),
318
335
  }).strict()
319
336
 
320
337
  export type PluginBuildableEnvelopeUpdateResult = z.infer<
321
338
  typeof PluginBuildableEnvelopeUpdateResult
322
339
  >
340
+
341
+ /**
342
+ * Patch for one site edge, as taken by `design.update.siteEdge`.
343
+ *
344
+ * Strict schema. Provide `role`, `setback`, or both. A numeric `setback`
345
+ * requires `lengthUnit`.
346
+ *
347
+ * | Property | Type | Description |
348
+ * |---|---|---|
349
+ * | `role` | `"front" \| "side" \| "rear"`? | New edge type. Setting it clears the edge's own distance |
350
+ * | `setback` | `number \| null`? | This edge's own setback distance in `lengthUnit` (finite, nonnegative); `null` clears it so the edge falls back to its type's distance |
351
+ * | `lengthUnit` | `"m" \| "ft"`? | Unit of `setback`; required when `setback` is a number |
352
+ */
353
+ export const PluginSiteEdgePatch = z
354
+ .object({
355
+ role: PluginProgramSiteEdgeRole.optional(),
356
+ // null = clear this edge's own distance
357
+ setback: z.number().finite().nonnegative().nullable().optional(),
358
+ lengthUnit: z.enum(["m", "ft"]).optional(),
359
+ })
360
+ .strict()
361
+ .refine(
362
+ (p) => p.role !== undefined || p.setback !== undefined,
363
+ "patch must set role and/or setback"
364
+ )
365
+ .refine(
366
+ (p) => typeof p.setback !== "number" || p.lengthUnit !== undefined,
367
+ "lengthUnit is required with a numeric setback"
368
+ )
369
+
370
+ export type PluginSiteEdgePatch = z.infer<typeof PluginSiteEdgePatch>
371
+
372
+ /**
373
+ * Result of `design.update.siteEdge` — the refreshed edge entry for the
374
+ * site, exactly as `program.site.listEdges()` returns it.
375
+ */
376
+ export const PluginDesignUpdateSiteEdgeResult = PluginProgramSiteEdgesEntry
377
+
378
+ export type PluginDesignUpdateSiteEdgeResult = z.infer<
379
+ typeof PluginDesignUpdateSiteEdgeResult
380
+ >
381
+
382
+ /**
383
+ * Result of `design.create.buildableEnvelopeFromSite`.
384
+ *
385
+ * | Property | Type | Description |
386
+ * |---|---|---|
387
+ * | `buildableEnvelopeId` | `string` | ID of the created buildable envelope |
388
+ */
389
+ export const PluginDesignCreateBuildableEnvelopeFromSiteResult = z
390
+ .object({
391
+ buildableEnvelopeId: z.string(),
392
+ })
393
+ .strict()
394
+
395
+ export type PluginDesignCreateBuildableEnvelopeFromSiteResult = z.infer<
396
+ typeof PluginDesignCreateBuildableEnvelopeFromSiteResult
397
+ >
@@ -1,6 +1,7 @@
1
1
  import * as z from "zod"
2
2
  import { PluginApiReturn } from "../../types"
3
3
  import { ProfileHandle, CurveHandle } from "../../handles"
4
+ import { PluginGraphicsLineStyleId } from "../presentation/graphics"
4
5
 
5
6
  /**
6
7
  * Reference line management — create, query, and delete reference lines.
@@ -53,7 +54,7 @@ export abstract class PluginReferenceLineApi {
53
54
  * @deprecated Use `design.create.referenceLines`
54
55
  */
55
56
  public abstract createMulti(
56
- profile: ProfileHandle
57
+ profile: ProfileHandle,
57
58
  ): PluginApiReturn<PluginReferenceLineCreateMultiResult>
58
59
 
59
60
  /**
@@ -85,7 +86,7 @@ export abstract class PluginReferenceLineApi {
85
86
  */
86
87
  public abstract get(
87
88
  referenceLineId: string,
88
- properties: z.infer<typeof PluginReferenceLineGetProperty>[]
89
+ properties: z.infer<typeof PluginReferenceLineGetProperty>[],
89
90
  ): PluginApiReturn<PluginReferenceLineGetResult>
90
91
 
91
92
  /**
@@ -135,7 +136,7 @@ export abstract class PluginReferenceLineApi {
135
136
  * @deprecated Use `design.delete.entities`
136
137
  */
137
138
  public abstract delete(
138
- referenceLineId: string
139
+ referenceLineId: string,
139
140
  ): PluginApiReturn<PluginReferenceLineDeleteResult>
140
141
  }
141
142
 
@@ -150,7 +151,9 @@ export const PluginReferenceLineCreateMultiArgs = z.object({
150
151
  profile: ProfileHandle,
151
152
  })
152
153
 
153
- export type PluginReferenceLineCreateMultiArgs = z.infer<typeof PluginReferenceLineCreateMultiArgs>
154
+ export type PluginReferenceLineCreateMultiArgs = z.infer<
155
+ typeof PluginReferenceLineCreateMultiArgs
156
+ >
154
157
 
155
158
  /**
156
159
  * Result of {@linkcode PluginReferenceLineApi.createMulti}.
@@ -163,7 +166,9 @@ export const PluginReferenceLineCreateMultiResult = z.object({
163
166
  referenceLineIds: z.array(z.string()),
164
167
  })
165
168
 
166
- export type PluginReferenceLineCreateMultiResult = z.infer<typeof PluginReferenceLineCreateMultiResult>
169
+ export type PluginReferenceLineCreateMultiResult = z.infer<
170
+ typeof PluginReferenceLineCreateMultiResult
171
+ >
167
172
 
168
173
  /**
169
174
  * Available properties that can be queried on a reference line.
@@ -171,10 +176,9 @@ export type PluginReferenceLineCreateMultiResult = z.infer<typeof PluginReferenc
171
176
  * | Value | Return Type | Description |
172
177
  * |---|---|---|
173
178
  * | `"curve"` | {@linkcode CurveHandle} | The curve geometry of the reference line, as an opaque handle |
179
+ * | `"styleId"` | `PluginGraphicsLineStyleId \| null` | Project style, or null for an unstyled legacy line |
174
180
  */
175
- export const PluginReferenceLineGetProperty = z.enum([
176
- "curve",
177
- ])
181
+ export const PluginReferenceLineGetProperty = z.enum(["curve", "styleId"])
178
182
 
179
183
  /**
180
184
  * Arguments for {@linkcode PluginReferenceLineApi.get}.
@@ -189,7 +193,9 @@ export const PluginReferenceLineGetArgs = z.object({
189
193
  properties: z.array(PluginReferenceLineGetProperty),
190
194
  })
191
195
 
192
- export type PluginReferenceLineGetArgs = z.infer<typeof PluginReferenceLineGetArgs>
196
+ export type PluginReferenceLineGetArgs = z.infer<
197
+ typeof PluginReferenceLineGetArgs
198
+ >
193
199
 
194
200
  /**
195
201
  * Result of {@linkcode PluginReferenceLineApi.get}.
@@ -200,10 +206,13 @@ export type PluginReferenceLineGetArgs = z.infer<typeof PluginReferenceLineGetAr
200
206
  export const PluginReferenceLineGetResult = z
201
207
  .object({
202
208
  curve: CurveHandle,
209
+ styleId: PluginGraphicsLineStyleId.nullable(),
203
210
  })
204
211
  .partial()
205
212
 
206
- export type PluginReferenceLineGetResult = z.infer<typeof PluginReferenceLineGetResult>
213
+ export type PluginReferenceLineGetResult = z.infer<
214
+ typeof PluginReferenceLineGetResult
215
+ >
207
216
 
208
217
  /**
209
218
  * Result of {@linkcode PluginReferenceLineApi.getAll}.
@@ -216,7 +225,9 @@ export const PluginReferenceLineGetAllResult = z.object({
216
225
  referenceLineIds: z.array(z.string()),
217
226
  })
218
227
 
219
- export type PluginReferenceLineGetAllResult = z.infer<typeof PluginReferenceLineGetAllResult>
228
+ export type PluginReferenceLineGetAllResult = z.infer<
229
+ typeof PluginReferenceLineGetAllResult
230
+ >
220
231
 
221
232
  /**
222
233
  * Arguments for {@linkcode PluginReferenceLineApi.delete}.
@@ -229,7 +240,9 @@ export const PluginReferenceLineDeleteArgs = z.object({
229
240
  referenceLineId: z.string(),
230
241
  })
231
242
 
232
- export type PluginReferenceLineDeleteArgs = z.infer<typeof PluginReferenceLineDeleteArgs>
243
+ export type PluginReferenceLineDeleteArgs = z.infer<
244
+ typeof PluginReferenceLineDeleteArgs
245
+ >
233
246
 
234
247
  /** Result type for {@linkcode PluginReferenceLineApi.delete} — returns nothing on success. */
235
248
  export type PluginReferenceLineDeleteResult = void
@@ -434,7 +434,6 @@ export type PluginSpaceUpdateArgs = z.infer<typeof PluginSpaceUpdateArgs>
434
434
  * | `massType` | `string?` | Updated mass type (if changed) |
435
435
  * | `spaceType` | `string?` | Updated space type (if changed) |
436
436
  * | `departmentId` | `string \| null?` | Updated department ID (if changed) |
437
- * | `rebuilt` | `boolean?` | `true` when a geometry update rebuilt the space's derived BIM — hosted children were re-created and the previous derived handles are retired (re-query them) |
438
437
  */
439
438
  export const PluginSpaceUpdateResult = z.object({
440
439
  spaceId: z.string(),
@@ -443,7 +442,6 @@ export const PluginSpaceUpdateResult = z.object({
443
442
  spaceType: z.string().optional(),
444
443
  areaClass: PluginAreaClass.optional(),
445
444
  departmentId: z.string().nullable().optional(),
446
- rebuilt: z.boolean().optional(),
447
445
  })
448
446
 
449
447
  export type PluginSpaceUpdateResult = z.infer<typeof PluginSpaceUpdateResult>
@@ -34,14 +34,15 @@ export abstract class PluginPresentationAnnotateApi {
34
34
  * falls back to regular. `fontSizePx` sets an exact pixel size, overriding
35
35
  * the `size` preset when both are given (`size` alone keeps working).
36
36
  *
37
- * @param sheetId - The sheet to annotate.
37
+ * @param sheetId - The sheet to annotate, or `undefined` when `options.drawingId` is used.
38
38
  * @param text - The label text.
39
39
  * @param options - Optional `position` (`{ x, y }`, relative to the sheet's
40
40
  * top-left, in canvas units — defaults to the sheet's top-left corner),
41
41
  * `size` (`"s" | "m" | "l" | "xl"`, default `"m"`), `color` (a named
42
42
  * palette color, default `"black"`), and typography: `fontFamily`,
43
43
  * `fontWeight` (numeric string, `-italic` suffix allowed), `fontSizePx`
44
- * (positive px size overriding the `size` preset).
44
+ * (positive px size overriding the `size` preset), and `drawingId` to parent
45
+ * the annotation to a drawing. Pass exactly one parent: `sheetId` or `drawingId`.
45
46
  * @returns A {@linkcode PluginPresentationAnnotateTextResult} with the created
46
47
  * `shapeId`.
47
48
  * @throws If Present mode is not open or the sheet id is invalid.
@@ -61,7 +62,7 @@ export abstract class PluginPresentationAnnotateApi {
61
62
  * ```
62
63
  */
63
64
  public abstract text(
64
- sheetId: string,
65
+ sheetId: string | undefined,
65
66
  text: string,
66
67
  options?: {
67
68
  position?: { x: number; y: number }
@@ -70,6 +71,7 @@ export abstract class PluginPresentationAnnotateApi {
70
71
  fontFamily?: string
71
72
  fontWeight?: string
72
73
  fontSizePx?: number
74
+ drawingId?: string
73
75
  },
74
76
  ): PluginApiReturn<PluginPresentationAnnotateTextResult>
75
77
 
@@ -80,11 +82,12 @@ export abstract class PluginPresentationAnnotateApi {
80
82
  * top-left, in canvas units — the same Arrow tool as the Present toolbar) and
81
83
  * returns the id of the created canvas shape. Requires Present mode to be open.
82
84
  *
83
- * @param sheetId - The sheet to annotate.
85
+ * @param sheetId - The sheet to annotate, or `undefined` when `options.drawingId` is used.
84
86
  * @param start - Arrow tail position (`{ x, y }`, relative to the sheet's top-left).
85
87
  * @param end - Arrow head position (`{ x, y }`, relative to the sheet's top-left).
86
88
  * @param options - Optional `color` (a named palette color, default `"black"`)
87
- * and `size` (stroke weight preset, `"s" | "m" | "l" | "xl"`, default `"m"`).
89
+ * `size` (stroke weight preset, `"s" | "m" | "l" | "xl"`, default `"m"`),
90
+ * and `drawingId` to parent the arrow to a drawing. Pass exactly one parent.
88
91
  * @returns A {@linkcode PluginPresentationAnnotateResult} with the created
89
92
  * `shapeId`.
90
93
  * @throws If Present mode is not open or the sheet id is invalid.
@@ -104,12 +107,13 @@ export abstract class PluginPresentationAnnotateApi {
104
107
  * ```
105
108
  */
106
109
  public abstract arrow(
107
- sheetId: string,
110
+ sheetId: string | undefined,
108
111
  start: { x: number; y: number },
109
112
  end: { x: number; y: number },
110
113
  options?: {
111
114
  color?: PluginAnnotateTextColor
112
115
  size?: PluginAnnotateTextSize
116
+ drawingId?: string
113
117
  },
114
118
  ): PluginApiReturn<PluginPresentationAnnotateResult>
115
119
 
@@ -120,13 +124,14 @@ export abstract class PluginPresentationAnnotateApi {
120
124
  * fixed-size sticky square that grows with its text) and returns the id of
121
125
  * the created canvas shape. Requires Present mode to be open.
122
126
  *
123
- * @param sheetId - The sheet to annotate.
127
+ * @param sheetId - The sheet to annotate, or `undefined` when `options.drawingId` is used.
124
128
  * @param text - The note text.
125
129
  * @param options - Optional `position` (`{ x, y }`, relative to the sheet's
126
130
  * top-left, in canvas units — defaults to the sheet's top-left corner),
127
131
  * `color` (a named palette color, default `"black"` — rendered as the
128
132
  * note's sticky fill), and `size` (text size preset,
129
- * `"s" | "m" | "l" | "xl"`, default `"m"`).
133
+ * `"s" | "m" | "l" | "xl"`, default `"m"`), and `drawingId` to parent
134
+ * the note to a drawing. Pass exactly one parent.
130
135
  * @returns A {@linkcode PluginPresentationAnnotateResult} with the created
131
136
  * `shapeId`.
132
137
  * @throws If Present mode is not open or the sheet id is invalid.
@@ -145,12 +150,13 @@ export abstract class PluginPresentationAnnotateApi {
145
150
  * ```
146
151
  */
147
152
  public abstract note(
148
- sheetId: string,
153
+ sheetId: string | undefined,
149
154
  text: string,
150
155
  options?: {
151
156
  position?: { x: number; y: number }
152
157
  color?: PluginAnnotateTextColor
153
158
  size?: PluginAnnotateTextSize
159
+ drawingId?: string
154
160
  },
155
161
  ): PluginApiReturn<PluginPresentationAnnotateResult>
156
162
 
@@ -162,14 +168,15 @@ export abstract class PluginPresentationAnnotateApi {
162
168
  * top-left, in canvas units) and returns the id of the created canvas shape.
163
169
  * Requires Present mode to be open.
164
170
  *
165
- * @param sheetId - The sheet to annotate.
171
+ * @param sheetId - The sheet to annotate, or `undefined` when `options.drawingId` is used.
166
172
  * @param kind - The shape kind ({@linkcode PluginAnnotateGeoKind}), e.g.
167
173
  * `"rectangle"`, `"ellipse"`, `"cloud"`.
168
174
  * @param bounds - Placement box `{ x, y, w, h }` — `x`/`y` are the shape's
169
175
  * top-left relative to the sheet's top-left; `w`/`h` must be positive.
170
176
  * @param options - Optional `color` (a named palette color, default
171
177
  * `"black"`) and `fill` ({@linkcode PluginAnnotateFill}, default `"none"` —
172
- * outline only).
178
+ * outline only), and `drawingId` to parent the shape to a drawing. Pass
179
+ * exactly one parent: `sheetId` or `drawingId`.
173
180
  * @returns A {@linkcode PluginPresentationAnnotateResult} with the created
174
181
  * `shapeId`.
175
182
  * @throws If Present mode is not open or the sheet id is invalid.
@@ -189,12 +196,13 @@ export abstract class PluginPresentationAnnotateApi {
189
196
  * ```
190
197
  */
191
198
  public abstract shape(
192
- sheetId: string,
199
+ sheetId: string | undefined,
193
200
  kind: PluginAnnotateGeoKind,
194
201
  bounds: { x: number; y: number; w: number; h: number },
195
202
  options?: {
196
203
  color?: PluginAnnotateTextColor
197
204
  fill?: PluginAnnotateFill
205
+ drawingId?: string
198
206
  },
199
207
  ): PluginApiReturn<PluginPresentationAnnotateResult>
200
208
  }
@@ -226,7 +234,8 @@ export type PluginAnnotateTextColor = z.infer<typeof PluginAnnotateTextColor>
226
234
  *
227
235
  * | Property | Type | Description |
228
236
  * |---|---|---|
229
- * | `sheetId` | `string` | The sheet to annotate |
237
+ * | `sheetId` | `string \| undefined` | The sheet parent; omit when `drawingId` is set |
238
+ * | `drawingId` | `string \| undefined` | The drawing parent; mutually exclusive with `sheetId` |
230
239
  * | `text` | `string` | The label text |
231
240
  * | `position` | `{ x: number; y: number } \| undefined` | Where to place it (relative to the sheet) |
232
241
  * | `size` | {@linkcode PluginAnnotateTextSize}` \| undefined` | Text size preset |
@@ -235,22 +244,27 @@ export type PluginAnnotateTextColor = z.infer<typeof PluginAnnotateTextColor>
235
244
  * | `fontWeight` | `string \| undefined` | Numeric weight like `"400"`/`"700"`, `-italic` suffix allowed |
236
245
  * | `fontSizePx` | `number \| undefined` | Exact px size (overrides the `size` preset) |
237
246
  */
238
- export const PluginPresentationAnnotateTextArgs = z.object({
239
- sheetId: z.string(),
240
- text: z.string(),
241
- position: z.object({ x: z.number(), y: z.number() }).optional(),
242
- size: PluginAnnotateTextSize.optional(),
243
- color: PluginAnnotateTextColor.optional(),
244
- fontFamily: z.string().min(1).optional(),
245
- fontWeight: z
246
- .string()
247
- .regex(
248
- /^\d{3}(-italic)?$/,
249
- 'fontWeight must be a numeric string like "400" or "700", optionally with the "-italic" suffix',
250
- )
251
- .optional(),
252
- fontSizePx: z.number().finite().positive().optional(),
253
- })
247
+ export const PluginPresentationAnnotateTextArgs = z
248
+ .object({
249
+ sheetId: z.string().min(1).optional(),
250
+ drawingId: z.string().min(1).optional(),
251
+ text: z.string(),
252
+ position: z.object({ x: z.number(), y: z.number() }).optional(),
253
+ size: PluginAnnotateTextSize.optional(),
254
+ color: PluginAnnotateTextColor.optional(),
255
+ fontFamily: z.string().min(1).optional(),
256
+ fontWeight: z
257
+ .string()
258
+ .regex(
259
+ /^\d{3}(-italic)?$/,
260
+ 'fontWeight must be a numeric string like "400" or "700", optionally with the "-italic" suffix',
261
+ )
262
+ .optional(),
263
+ fontSizePx: z.number().finite().positive().optional(),
264
+ })
265
+ .refine(({ sheetId, drawingId }) => Boolean(sheetId) !== Boolean(drawingId), {
266
+ message: "exactly one of sheetId or drawingId is required",
267
+ })
254
268
  export type PluginPresentationAnnotateTextArgs = z.infer<
255
269
  typeof PluginPresentationAnnotateTextArgs
256
270
  >
@@ -302,19 +316,25 @@ export type PluginAnnotateFill = z.infer<typeof PluginAnnotateFill>
302
316
  *
303
317
  * | Property | Type | Description |
304
318
  * |---|---|---|
305
- * | `sheetId` | `string` | The sheet to annotate |
319
+ * | `sheetId` | `string \| undefined` | The sheet parent; omit when `drawingId` is set |
320
+ * | `drawingId` | `string \| undefined` | The drawing parent; mutually exclusive with `sheetId` |
306
321
  * | `start` | `{ x: number; y: number }` | Arrow tail (relative to the sheet) |
307
322
  * | `end` | `{ x: number; y: number }` | Arrow head (relative to the sheet) |
308
323
  * | `color` | {@linkcode PluginAnnotateTextColor}` \| undefined` | Arrow color |
309
324
  * | `size` | {@linkcode PluginAnnotateTextSize}` \| undefined` | Stroke weight preset |
310
325
  */
311
- export const PluginPresentationAnnotateArrowArgs = z.object({
312
- sheetId: z.string(),
313
- start: z.object({ x: z.number(), y: z.number() }),
314
- end: z.object({ x: z.number(), y: z.number() }),
315
- color: PluginAnnotateTextColor.optional(),
316
- size: PluginAnnotateTextSize.optional(),
317
- })
326
+ export const PluginPresentationAnnotateArrowArgs = z
327
+ .object({
328
+ sheetId: z.string().min(1).optional(),
329
+ drawingId: z.string().min(1).optional(),
330
+ start: z.object({ x: z.number(), y: z.number() }),
331
+ end: z.object({ x: z.number(), y: z.number() }),
332
+ color: PluginAnnotateTextColor.optional(),
333
+ size: PluginAnnotateTextSize.optional(),
334
+ })
335
+ .refine(({ sheetId, drawingId }) => Boolean(sheetId) !== Boolean(drawingId), {
336
+ message: "exactly one of sheetId or drawingId is required",
337
+ })
318
338
  export type PluginPresentationAnnotateArrowArgs = z.infer<
319
339
  typeof PluginPresentationAnnotateArrowArgs
320
340
  >
@@ -324,19 +344,25 @@ export type PluginPresentationAnnotateArrowArgs = z.infer<
324
344
  *
325
345
  * | Property | Type | Description |
326
346
  * |---|---|---|
327
- * | `sheetId` | `string` | The sheet to annotate |
347
+ * | `sheetId` | `string \| undefined` | The sheet parent; omit when `drawingId` is set |
348
+ * | `drawingId` | `string \| undefined` | The drawing parent; mutually exclusive with `sheetId` |
328
349
  * | `text` | `string` | The note text |
329
350
  * | `position` | `{ x: number; y: number } \| undefined` | Where to place it (relative to the sheet) |
330
351
  * | `color` | {@linkcode PluginAnnotateTextColor}` \| undefined` | Sticky fill color |
331
352
  * | `size` | {@linkcode PluginAnnotateTextSize}` \| undefined` | Text size preset |
332
353
  */
333
- export const PluginPresentationAnnotateNoteArgs = z.object({
334
- sheetId: z.string(),
335
- text: z.string(),
336
- position: z.object({ x: z.number(), y: z.number() }).optional(),
337
- color: PluginAnnotateTextColor.optional(),
338
- size: PluginAnnotateTextSize.optional(),
339
- })
354
+ export const PluginPresentationAnnotateNoteArgs = z
355
+ .object({
356
+ sheetId: z.string().min(1).optional(),
357
+ drawingId: z.string().min(1).optional(),
358
+ text: z.string(),
359
+ position: z.object({ x: z.number(), y: z.number() }).optional(),
360
+ color: PluginAnnotateTextColor.optional(),
361
+ size: PluginAnnotateTextSize.optional(),
362
+ })
363
+ .refine(({ sheetId, drawingId }) => Boolean(sheetId) !== Boolean(drawingId), {
364
+ message: "exactly one of sheetId or drawingId is required",
365
+ })
340
366
  export type PluginPresentationAnnotateNoteArgs = z.infer<
341
367
  typeof PluginPresentationAnnotateNoteArgs
342
368
  >
@@ -346,24 +372,30 @@ export type PluginPresentationAnnotateNoteArgs = z.infer<
346
372
  *
347
373
  * | Property | Type | Description |
348
374
  * |---|---|---|
349
- * | `sheetId` | `string` | The sheet to annotate |
375
+ * | `sheetId` | `string \| undefined` | The sheet parent; omit when `drawingId` is set |
376
+ * | `drawingId` | `string \| undefined` | The drawing parent; mutually exclusive with `sheetId` |
350
377
  * | `kind` | {@linkcode PluginAnnotateGeoKind} | The shape kind |
351
378
  * | `bounds` | `{ x: number; y: number; w: number; h: number }` | Placement box (relative to the sheet; `w`/`h` positive) |
352
379
  * | `color` | {@linkcode PluginAnnotateTextColor}` \| undefined` | Outline color |
353
380
  * | `fill` | {@linkcode PluginAnnotateFill}` \| undefined` | Fill style |
354
381
  */
355
- export const PluginPresentationAnnotateShapeArgs = z.object({
356
- sheetId: z.string(),
357
- kind: PluginAnnotateGeoKind,
358
- bounds: z.object({
359
- x: z.number(),
360
- y: z.number(),
361
- w: z.number().positive(),
362
- h: z.number().positive(),
363
- }),
364
- color: PluginAnnotateTextColor.optional(),
365
- fill: PluginAnnotateFill.optional(),
366
- })
382
+ export const PluginPresentationAnnotateShapeArgs = z
383
+ .object({
384
+ sheetId: z.string().min(1).optional(),
385
+ drawingId: z.string().min(1).optional(),
386
+ kind: PluginAnnotateGeoKind,
387
+ bounds: z.object({
388
+ x: z.number(),
389
+ y: z.number(),
390
+ w: z.number().positive(),
391
+ h: z.number().positive(),
392
+ }),
393
+ color: PluginAnnotateTextColor.optional(),
394
+ fill: PluginAnnotateFill.optional(),
395
+ })
396
+ .refine(({ sheetId, drawingId }) => Boolean(sheetId) !== Boolean(drawingId), {
397
+ message: "exactly one of sheetId or drawingId is required",
398
+ })
367
399
  export type PluginPresentationAnnotateShapeArgs = z.infer<
368
400
  typeof PluginPresentationAnnotateShapeArgs
369
401
  >