@snaptrude/plugin-core 0.9.16 → 0.9.18-voids-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 (107) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/api-manifest.full.json +10406 -0
  3. package/api-manifest.json +827 -51
  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 +1703 -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 +3749 -2328
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.js +3616 -2328
  73. package/dist/index.js.map +1 -1
  74. package/package.json +1 -1
  75. package/scripts/generate-manifest.mjs +5 -0
  76. package/src/api/core/camera/index.ts +29 -0
  77. package/src/api/core/geom/create/index.ts +7 -1
  78. package/src/api/core/geom/update/contour.ts +8 -2
  79. package/src/api/core/zoom/index.ts +13 -0
  80. package/src/api/design/bim.ts +121 -0
  81. package/src/api/design/boolean/index.ts +2 -0
  82. package/src/api/design/catalog.ts +203 -0
  83. package/src/api/design/create/bulk-items.ts +57 -17
  84. package/src/api/design/create/index.ts +288 -120
  85. package/src/api/design/create/opening-fields.ts +15 -12
  86. package/src/api/design/delete/index.ts +1 -0
  87. package/src/api/design/doors/index.ts +58 -42
  88. package/src/api/design/family.ts +662 -32
  89. package/src/api/design/index.ts +34 -4
  90. package/src/api/design/networks.ts +607 -0
  91. package/src/api/design/query/index.ts +12 -2
  92. package/src/api/design/types/index.ts +31 -24
  93. package/src/api/design/update/index.ts +44 -3
  94. package/src/api/design/windows/index.ts +40 -22
  95. package/src/api/presentation/annotate.ts +90 -58
  96. package/src/api/presentation/drawingContract.ts +70 -0
  97. package/src/api/presentation/drawings.ts +1179 -0
  98. package/src/api/presentation/export.ts +32 -6
  99. package/src/api/presentation/index.ts +48 -14
  100. package/src/api/presentation/placedViews.ts +119 -28
  101. package/src/api/presentation/sections.ts +420 -0
  102. package/src/api/presentation/sheets.ts +181 -20
  103. package/src/api/presentation/viewPresets.ts +241 -0
  104. package/src/api/presentation/views.ts +46 -6
  105. package/src/errors/codes.ts +7 -0
  106. package/test/drawingContract.test.mjs +288 -0
  107. package/test/errors.test.mjs +1 -0
@@ -1,11 +1,13 @@
1
1
  import * as z from "zod";
2
2
  import { PluginApiReturn } from "../../../types";
3
- import { BrepHandle, ComponentHandle, ContourHandle, CurveHandle, ProfileHandle, Vec3Handle } from "../../../handles";
3
+ import { BrepHandle, ComponentHandle, ContourHandle, LineHandle, CurveHandle, ProfileHandle, Vec3Handle } from "../../../handles";
4
4
  import { PluginGridStyleOptions } from "./grids";
5
5
  import { PluginSpaceType, PluginMassType, PluginDepartmentId } from "../../entity/space";
6
6
  import { PluginBuildableEnvelopePolygonVertex, PluginBuildableEnvelopeSetbackTier, PluginBuildableEnvelopeVerticalCap, PluginBuildableEnvelopeCreateResult } from "../../entity/buildableEnvelope";
7
- import type { PluginCreateDoorItem, PluginCreateFloorItem, PluginCreateFurnitureItem, PluginCreateWallRunItem, PluginCreateWindowItem } from "./bulk-items";
7
+ import type { PluginCreateDoorItem, PluginCreateFloorItem, PluginCreateFurnitureItem, PluginCreateVoidItem, PluginCreateWallRunItem, PluginCreateWindowItem } from "./bulk-items";
8
8
  import { PluginWallTopProfile } from "./bulk-items";
9
+ import { PluginWallType } from "../types";
10
+ import { PluginFamilyPlacement, PluginFamilyFloorOptions, PluginFamilySlabOptions, PluginFamilyCeilingOptions, PluginFamilyValues } from "../catalog";
9
11
  /**
10
12
  * `design.create.*` — author new scene-committed BIM entities.
11
13
  *
@@ -19,9 +21,17 @@ import { PluginWallTopProfile } from "./bulk-items";
19
21
  * Footprint objects take a {@linkcode ContourHandle} (outer profile + holes);
20
22
  * build one with `snaptrude.core.geom.create.contourFromProfile(s)`.
21
23
  *
22
- * `door`/`window` place a catalog item into a host wall (the world point is
24
+ * Family overloads take `{ type, values? }` from `design.catalog`. The family supplies
25
+ * construction; the contour or axis supplies instance geometry. Geometry uses SU,
26
+ * while family length overrides use mm and angles use degrees. Omitted parameters
27
+ * retain family defaults; shared/type, formula and geometry-bound overrides are refused.
28
+ * Placement never publishes a definition. Unsupported references or geometry fail before mutation.
29
+ *
30
+ * `door`/`window` place a parametric family into a host wall (the world point is
23
31
  * projected onto the wall face to locate the opening; the wall is re-cut in one
24
- * undo entry) and throw if the point projects outside the wall. `smartLayout` is
32
+ * undo entry) and throw if the point projects outside the wall. Voids
33
+ * (`void`/`voids`) are the third hosted child: holes through slabs, floors,
34
+ * roofs and ceilings. `smartLayout` is
25
35
  * the one creator returning a grouped {@linkcode PluginSmartLayoutResult} rather
26
36
  * than a handle — it clones an in-scene template into one or more target spaces,
27
37
  * merging every target into a single undo batch (see its JSDoc).
@@ -152,6 +162,9 @@ export declare abstract class PluginDesignCreateApi {
152
162
  * Create a **slab** by extruding a footprint contour by `thickness`
153
163
  * (default direction: down).
154
164
  *
165
+ * To cut a hole in an EXISTING one, use `design.create.void`; a contour hole
166
+ * here is baked into the footprint.
167
+ *
155
168
  * @param contour - Footprint (outer + holes)
156
169
  * @param thickness - Slab thickness (> 0)
157
170
  * @param direction - Extrusion direction (default `"down"`)
@@ -172,15 +185,28 @@ export declare abstract class PluginDesignCreateApi {
172
185
  * const slab = await snaptrude.design.create.slab(contour, 0.15, "down", "Plinth")
173
186
  * ```
174
187
  */
175
- abstract slab(contour: ContourHandle, thickness: number, direction?: "up" | "down", slabType?: PluginSlabType): PluginApiReturn<ComponentHandle>;
188
+ abstract slab(...args: [
189
+ contour: ContourHandle,
190
+ thickness: number,
191
+ direction?: "up" | "down",
192
+ slabType?: PluginSlabType
193
+ ] | [contour: ContourHandle, options: PluginFamilySlabOptions]): PluginApiReturn<ComponentHandle>;
176
194
  /**
177
195
  * Create a **floor** by extruding a footprint contour by `thickness`
178
196
  * (extruded upward).
179
197
  *
198
+ * The native family overload takes `{ type, values?, position? }`. Contour
199
+ * geometry uses SU; family values use mm. The family supplies layer thickness.
200
+ * PG2 can split or merge the footprint, so both overloads return an array.
201
+ * A merge into an existing floor can return no newly created handles.
202
+ *
203
+ * To cut a hole in an EXISTING one, use `design.create.void`; a contour hole
204
+ * here is baked into the footprint.
205
+ *
180
206
  * @param contour - Footprint (outer + holes)
181
207
  * @param thickness - Floor thickness (> 0)
182
208
  * @param position - Offset from origin
183
- * @returns the {@linkcode ComponentHandle} of the created floor
209
+ * @returns Newly created {@linkcode ComponentHandle}s; an empty array after a merge
184
210
  * @throws if the contour is invalid or the thickness is not positive
185
211
  *
186
212
  * @examplePrompt Create a floor from this room outline
@@ -195,11 +221,11 @@ export declare abstract class PluginDesignCreateApi {
195
221
  * const floor = await snaptrude.design.create.floor(contour, 0.1)
196
222
  * ```
197
223
  *
198
- * @performance For MORE THAN ONE floor, call `design.create.floors(items[])` — one
199
- * host round-trip and ONE undo entry for the whole batch. Looping this single-floor
200
- * creator is N round-trips and N undo entries.
224
+ * @performance For dimensional floors, `design.create.floors(items[])` uses one
225
+ * host round-trip and one undo entry. That bulk method does not accept native
226
+ * family options; use this method for a family-backed floor.
201
227
  */
202
- abstract floor(contour: ContourHandle, thickness: number, position?: Vec3Handle): PluginApiReturn<ComponentHandle>;
228
+ abstract floor(...args: [contour: ContourHandle, thickness: number, position?: Vec3Handle] | [contour: ContourHandle, options: PluginFamilyFloorOptions]): PluginApiReturn<ComponentHandle[]>;
203
229
  /**
204
230
  * Create **many floors** in one undoable operation (bulk plural of
205
231
  * {@linkcode floor}). Each item extrudes its own footprint contour (outer
@@ -241,6 +267,9 @@ export declare abstract class PluginDesignCreateApi {
241
267
  * Create a **roof** by extruding a footprint contour by `thickness`. Created
242
268
  * flat (extruded downward); pitch/slope is a separate post-creation edit.
243
269
  *
270
+ * To cut a hole in an EXISTING one, use `design.create.void`; a contour hole
271
+ * here is baked into the footprint.
272
+ *
244
273
  * @param contour - Footprint (outer + holes)
245
274
  * @param thickness - Roof-slab thickness (> 0)
246
275
  * @returns the {@linkcode ComponentHandle} of the created roof
@@ -258,11 +287,14 @@ export declare abstract class PluginDesignCreateApi {
258
287
  * const roof = await snaptrude.design.create.roof(contour, 0.2)
259
288
  * ```
260
289
  */
261
- abstract roof(contour: ContourHandle, thickness: number): PluginApiReturn<ComponentHandle>;
290
+ abstract roof(contour: ContourHandle, thickness: number | PluginFamilyPlacement): PluginApiReturn<ComponentHandle>;
262
291
  /**
263
292
  * Create a **ceiling** by extruding a footprint contour by `thickness`, lifted
264
293
  * `heightFromFloor` above the floor.
265
294
  *
295
+ * To cut a hole in an EXISTING one, use `design.create.void`; a contour hole
296
+ * here is baked into the footprint.
297
+ *
266
298
  * @param contour - Footprint (outer + holes)
267
299
  * @param thickness - Ceiling thickness (> 0)
268
300
  * @param heightFromFloor - Lift above the floor (default 0)
@@ -281,7 +313,7 @@ export declare abstract class PluginDesignCreateApi {
281
313
  * const ceiling = await snaptrude.design.create.ceiling(contour, 0.05, 2.8)
282
314
  * ```
283
315
  */
284
- abstract ceiling(contour: ContourHandle, thickness: number, heightFromFloor?: number): PluginApiReturn<ComponentHandle>;
316
+ abstract ceiling(...args: [contour: ContourHandle, thickness: number, heightFromFloor?: number] | [contour: ContourHandle, options: PluginFamilyCeilingOptions]): PluginApiReturn<ComponentHandle>;
285
317
  /**
286
318
  * Create a **column** by extruding a cross-section contour upward by `height`
287
319
  * from a base `position`. The column is built to EXACTLY `height` — unlike
@@ -309,7 +341,12 @@ export declare abstract class PluginDesignCreateApi {
309
341
  * const column = await snaptrude.design.create.column(base, crossSection, 3)
310
342
  * ```
311
343
  */
312
- abstract column(position: Vec3Handle, crossSection: ContourHandle, height: number, directionUp?: Vec3Handle): PluginApiReturn<ComponentHandle>;
344
+ abstract column(...args: [
345
+ position: Vec3Handle,
346
+ crossSection: ContourHandle,
347
+ height: number,
348
+ directionUp?: Vec3Handle
349
+ ] | [axis: LineHandle, options: PluginFamilyPlacement]): PluginApiReturn<ComponentHandle>;
313
350
  /**
314
351
  * Create a **beam** by extruding a cross-section contour along `direction` by
315
352
  * `length`. Matches the Snaptrude beam tool's semantics: the beam body hangs
@@ -350,7 +387,7 @@ export declare abstract class PluginDesignCreateApi {
350
387
  * const beam = await snaptrude.design.create.beam(section, 6, alongX)
351
388
  * ```
352
389
  */
353
- abstract beam(section: ContourHandle, length: number, direction?: Vec3Handle): PluginApiReturn<ComponentHandle>;
390
+ abstract beam(...args: [section: ContourHandle, length: number, direction?: Vec3Handle] | [axis: LineHandle, options: PluginFamilyPlacement]): PluginApiReturn<ComponentHandle>;
354
391
  /**
355
392
  * Create a connected run of **walls** from a profile — one wall per curve in
356
393
  * the profile's chain, with mitred corners at shared endpoints.
@@ -359,12 +396,12 @@ export declare abstract class PluginDesignCreateApi {
359
396
  * @param height - Wall height (default engine default)
360
397
  * @param thickness - Wall thickness (default: the `wallType`'s total layer
361
398
  * thickness when `wallType` is given, else the engine default)
362
- * @param wallType - Wall type to build with — the same searchable list the
363
- * Draw tab's Wall Type dropdown offers. Pass a name from
364
- * `design.types.list("wall")` (the summary's `label`, or its `"wall:…"` id).
365
- * Drives the wall's construction layers and default material, and — when
366
- * `thickness` is omitted — its total layer thickness. Default: the engine's
367
- * generic wall.
399
+ * @param wallType - Legacy label/`wall:` id, or the exact `nativeFamily`
400
+ * `{ id, version }` pin from `design.types.list("wall")`. Native pins are
401
+ * authorized on every use; selecting a family in Draw is not registration.
402
+ * Native pins support straight horizontal centerlines and flat tops only.
403
+ * Omit thickness for native pins; a conflicting explicit thickness rejects.
404
+ * Default: the engine's generic wall.
368
405
  * @param storey - Target storey (integer: `1` ground, `2` first floor, `-1`
369
406
  * basement — same convention as `design.create.space`). The walls are
370
407
  * assigned to it and lifted to its base elevation, all inside the same
@@ -419,7 +456,7 @@ export declare abstract class PluginDesignCreateApi {
419
456
  * host round-trip and ONE undo entry for every run in the batch. Looping this
420
457
  * single-run creator is N round-trips and N undo entries.
421
458
  */
422
- abstract walls(profile: ProfileHandle, height?: number, thickness?: number, wallType?: string, storey?: number, topProfiles?: (PluginWallTopProfile | null)[]): PluginApiReturn<ComponentHandle[]>;
459
+ abstract walls(profile: ProfileHandle, height?: number, thickness?: number, wallType?: PluginWallType, storey?: number, topProfiles?: (PluginWallTopProfile | null)[], values?: PluginFamilyValues): PluginApiReturn<ComponentHandle[]>;
423
460
  /**
424
461
  * Create **many wall runs** in one undoable operation (bulk plural of
425
462
  * {@linkcode walls}). Each item is one full run — a wall per curve in that
@@ -761,30 +798,23 @@ export declare abstract class PluginDesignCreateApi {
761
798
  */
762
799
  abstract furnitureItems(items: PluginCreateFurnitureItem[]): PluginApiReturn<ComponentHandle[]>;
763
800
  /**
764
- * Place a **door** from the catalog into a host wall.
801
+ * Place a parametric **door** family into a host wall.
765
802
  *
766
- * Identified by a **catalog (library) id** — the team object's stable `_id`
767
- * or the general library's `fullName`. Discover ids with
803
+ * Identified by a saved **family definition id**. Discover ids with
768
804
  * {@linkcode PluginDesignDoorsApi.listCatalog}. The world `position` is
769
805
  * projected onto the host wall's face to locate the opening; the wall is
770
806
  * re-cut and the door hosted in a single undo entry. Placement is
771
- * asynchronous (the source mesh is fetched if not cached).
807
+ * asynchronous. Values and host bindings are evaluated before the first cut.
772
808
  *
773
- * @param catalogId - Library id: team `_id` or general `fullName`
809
+ * @param familyId - Hosted door definition ID; legacy mesh catalog IDs are not accepted
774
810
  * @param hostWall - The wall to host the door
775
811
  * @param position - World point projected onto the wall to locate the opening
776
- * @param options - Optional placement options: `label` — instance name;
777
- * `hinge` — world point near the jamb the door is hinged on (the door is
778
- * reflected along the wall so its hinged jamb is the one nearer this
779
- * point; default the catalog item's authored hinge side)
780
- * @param facing - World point on the side of the wall the door swings open
781
- * to (the room it opens into — where the plan symbol draws the swing arc).
782
- * Any point clearly on that side works (e.g. the room's center). Default:
783
- * the engine picks a side (nondeterministic when `position` sits on the
784
- * wall centerline).
812
+ * @param options - `version` pins the definition. `values` sets authored parameters
813
+ * (numeric lengths in SU, or unit strings). `label` names the instance.
814
+ * `hinge` selects the declared `hand` enum: local -X is left, +X is right.
815
+ * @param facing - World point selecting local +Z; omitted uses the picked face
785
816
  * @returns the {@linkcode ComponentHandle} of the placed door
786
- * @throws if the catalog id is unknown, the host is not a wall, the source
787
- * mesh fails to load, or the projected point falls **outside** the host wall
817
+ * @throws if the family/category/parameters are invalid, or placement or cutting fails
788
818
  *
789
819
  * @examplePrompt Add a door to this wall here
790
820
  * @examplePrompt Place a sliding door on the selected wall
@@ -826,23 +856,22 @@ export declare abstract class PluginDesignCreateApi {
826
856
  * round-trip and ONE undo entry, with each host wall re-cut once per opening inside
827
857
  * that single call. Looping this single-door creator is N round-trips.
828
858
  */
829
- abstract door(catalogId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
859
+ abstract door(familyId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
830
860
  label?: string;
831
861
  hinge?: Vec3Handle;
862
+ version?: number;
863
+ values?: Record<string, number | string>;
832
864
  }, facing?: Vec3Handle): PluginApiReturn<ComponentHandle>;
833
865
  /**
834
866
  * Place **many doors** into host walls in one undoable operation (bulk plural
835
- * of {@linkcode door}). Each item carries its own catalog id, host wall,
867
+ * of {@linkcode door}). Each item carries its own family id, host wall,
836
868
  * world position, and optional `facing`, `label`, `width` and `height` — the
837
869
  * same fields as a `"door"` {@linkcode PluginDesignCreateOpeningOptions}.
838
870
  * Validate-all-or-throw; one command.
839
871
  *
840
- * As with the singular creator, placing an opening **re-cuts its host wall**:
841
- * the wall you passed as `hostWall` stops resolving once the call returns.
842
- * Several items MAY name the same original wall handle in one call — the host
843
- * chains the re-cuts internally — but after the call recover the surviving
844
- * wall with `design.query.getHost(opening)`, never by reusing the handle you
845
- * passed in.
872
+ * The wall keeps its identity. Several items may use the same host.
873
+ * Width and height set named recipe parameters, not mesh scale. The recipe's
874
+ * evaluated hole can include frame allowances. A failed item rolls back the batch.
846
875
  *
847
876
  * @param items - One {@linkcode PluginCreateDoorItem} per door to place
848
877
  * (≥1, ≤1000)
@@ -850,10 +879,9 @@ export declare abstract class PluginDesignCreateApi {
850
879
  * @throws `VALIDATION` if the items fail the schema (empty array, more than
851
880
  * 1000 items, unknown fields, a non-positive `width`/`height`);
852
881
  * `HANDLE_INVALID` if a `position`, `facing` or `hinge` handle is unknown
853
- * or released; `PRECONDITION_FAILED` if a catalog id is unknown, a `hostWall`
854
- * is not a wall / is locked / is not in the active proposal, the projected
855
- * point falls outside its host wall, or a door tool is active;
856
- * `OPERATION_FAILED` if a source mesh fails to load or placement fails
882
+ * or released; `PRECONDITION_FAILED` if the family cannot be resolved or saved,
883
+ * or a host is locked / is not in the active proposal;
884
+ * `OPERATION_FAILED` if placement, containment, overlap checks or cutting fail
857
885
  * (nothing is created — `details.itemIndex` is the failing item);
858
886
  * `METHOD_NOT_PERMITTED` if the plugin may not write.
859
887
  *
@@ -864,7 +892,7 @@ export declare abstract class PluginDesignCreateApi {
864
892
  * @examplePrompt Add all the doors for this floor plan together
865
893
  *
866
894
  * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
867
- * entry, and each distinct catalog source loads once. Always prefer this over
895
+ * entry. Always prefer this over
868
896
  * calling `design.create.door` in a loop: build the full `items[]` array first
869
897
  * (all host walls and points up front), then make one call.
870
898
  *
@@ -874,38 +902,30 @@ export declare abstract class PluginDesignCreateApi {
874
902
  * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
875
903
  * const [entry] = await snaptrude.design.doors.listCatalog()
876
904
  * const [front, side] = await snaptrude.design.create.doors([
877
- * { catalogId: entry.id, hostWall: wall, position: await v.new(2, 0, 5), label: "D-01" },
878
- * { catalogId: entry.id, hostWall: wall, position: await v.new(6, 0, 5), width: 1.2 },
905
+ * { familyId: entry.id, hostWall: wall, position: await v.new(2, 0, 5), label: "D-01" },
906
+ * { familyId: entry.id, hostWall: wall, position: await v.new(6, 0, 5), values: { width: "1200mm" } },
879
907
  * ])
880
- * // `wall` was re-cut twice and no longer resolves — ask the opening for its host:
908
+ * // The host still resolves after both cuts:
881
909
  * const currentWall = await snaptrude.design.query.getHost(front)
882
910
  * ```
883
911
  */
884
912
  abstract doors(items: PluginCreateDoorItem[]): PluginApiReturn<ComponentHandle[]>;
885
913
  /**
886
- * Place a **window** from the catalog into a host wall.
914
+ * Place a parametric **window** family into a host wall.
887
915
  *
888
- * Identified by a **catalog (library) id** — the team object's stable `_id`
889
- * or the general library's `fullName`. Discover ids with
916
+ * Identified by a saved **family definition id**. Discover ids with
890
917
  * {@linkcode PluginDesignWindowsApi.listCatalog}. The world `position` is
891
918
  * projected onto the host wall's face to locate the opening; the wall is
892
919
  * re-cut and the window hosted in a single undo entry. Placement is
893
- * asynchronous (the source mesh is fetched if not cached).
920
+ * asynchronous. The sill parameter determines elevation; position Y is ignored.
894
921
  *
895
- * @param catalogId - Library id: team `_id` or general `fullName`
922
+ * @param familyId - Hosted window definition ID; legacy mesh catalog IDs are not accepted
896
923
  * @param hostWall - The wall to host the window
897
924
  * @param position - World point projected onto the wall to locate the opening
898
- * @param options - Optional placement options: `label` — instance name;
899
- * `hinge` — world point near the jamb the window is hinged on (same rule
900
- * as {@linkcode PluginDesignCreateApi.door}; default the catalog item's
901
- * authored side)
902
- * @param facing - World point on the side of the wall the window opens to
903
- * (matters for asymmetric windows, e.g. casement swing) — same convention
904
- * as {@linkcode PluginDesignCreateApi.door}. Default: the engine picks a
905
- * side (nondeterministic when `position` sits on the centerline).
925
+ * @param options - `version`, `values`, `label`, and parameter-driven `hinge`, as for door
926
+ * @param facing - World point selecting local +Z; omitted uses the picked face
906
927
  * @returns the {@linkcode ComponentHandle} of the placed window
907
- * @throws if the catalog id is unknown, the host is not a wall, the source
908
- * mesh fails to load, or the projected point falls **outside** the host wall
928
+ * @throws if the family/category/parameters are invalid, or placement or cutting fails
909
929
  *
910
930
  * @examplePrompt Add a window to this wall here
911
931
  * @examplePrompt Place a casement window on the selected wall
@@ -930,25 +950,23 @@ export declare abstract class PluginDesignCreateApi {
930
950
  * host round-trip and ONE undo entry, with each host wall re-cut once per opening
931
951
  * inside that single call. Looping this single-window creator is N round-trips.
932
952
  */
933
- abstract window(catalogId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
953
+ abstract window(familyId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
934
954
  label?: string;
935
955
  hinge?: Vec3Handle;
956
+ version?: number;
957
+ values?: Record<string, number | string>;
936
958
  }, facing?: Vec3Handle): PluginApiReturn<ComponentHandle>;
937
959
  /**
938
960
  * Place **many windows** into host walls in one undoable operation (bulk
939
- * plural of {@linkcode window}). Each item carries its own catalog id, host
961
+ * plural of {@linkcode window}). Each item carries its own family id, host
940
962
  * wall, world position, and optional `facing`, `label`, `width`, `height` and
941
963
  * `sillHeight` — the same fields as a `"window"`
942
964
  * {@linkcode PluginDesignCreateOpeningOptions}. `sillHeight` is measured from
943
965
  * the host wall base to the BOTTOM of the window. Validate-all-or-throw; one
944
966
  * command.
945
967
  *
946
- * As with the singular creator, placing an opening **re-cuts its host wall**:
947
- * the wall you passed as `hostWall` stops resolving once the call returns.
948
- * Several items MAY name the same original wall handle in one call — the host
949
- * chains the re-cuts internally — but after the call recover the surviving
950
- * wall with `design.query.getHost(opening)`, never by reusing the handle you
951
- * passed in.
968
+ * Hosts keep their identity. Width, height and sillHeight set the declared
969
+ * width, height and sill parameters before the first cut. No mesh scaling occurs.
952
970
  *
953
971
  * @param items - One {@linkcode PluginCreateWindowItem} per window to place
954
972
  * (≥1, ≤1000)
@@ -956,10 +974,9 @@ export declare abstract class PluginDesignCreateApi {
956
974
  * @throws `VALIDATION` if the items fail the schema (empty array, more than
957
975
  * 1000 items, unknown fields, a non-positive `width`/`height`, a negative
958
976
  * `sillHeight`); `HANDLE_INVALID` if a `position`, `facing` or `hinge`
959
- * handle is unknown or released; `PRECONDITION_FAILED` if a catalog id is unknown, a
960
- * `hostWall` is not a wall / is locked / is not in the active proposal, the
961
- * projected point falls outside its host wall, or a window tool is active;
962
- * `OPERATION_FAILED` if a source mesh fails to load or placement fails
977
+ * handle is unknown or released; `PRECONDITION_FAILED` if the family cannot be
978
+ * resolved or saved, or a host is locked / is not in the active proposal;
979
+ * `OPERATION_FAILED` if placement, containment, overlap checks or cutting fail
963
980
  * (nothing is created — `details.itemIndex` is the failing item);
964
981
  * `METHOD_NOT_PERMITTED` if the plugin may not write.
965
982
  *
@@ -970,7 +987,7 @@ export declare abstract class PluginDesignCreateApi {
970
987
  * @examplePrompt Add all the windows with a 0.9m sill height together
971
988
  *
972
989
  * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
973
- * entry, and each distinct catalog source loads once. Always prefer this over
990
+ * entry. Always prefer this over
974
991
  * calling `design.create.window` in a loop: build the full `items[]` array first
975
992
  * (all host walls and points up front), then make one call.
976
993
  *
@@ -980,25 +997,161 @@ export declare abstract class PluginDesignCreateApi {
980
997
  * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
981
998
  * const [casement] = await snaptrude.design.windows.listCatalog()
982
999
  * const placed = await snaptrude.design.create.windows([
983
- * { catalogId: casement.id, hostWall: wall, position: await v.new(2, 0, 5), sillHeight: 0.9 },
984
- * { catalogId: casement.id, hostWall: wall, position: await v.new(5, 0, 5), sillHeight: 0.9 },
1000
+ * { familyId: casement.id, hostWall: wall, position: await v.new(2, 0, 5), values: { sill: "900mm" } },
1001
+ * { familyId: casement.id, hostWall: wall, position: await v.new(5, 0, 5), values: { sill: "900mm" } },
985
1002
  * ])
986
1003
  * const currentWall = await snaptrude.design.query.getHost(placed[0])
987
1004
  * ```
988
1005
  */
989
1006
  abstract windows(items: PluginCreateWindowItem[]): PluginApiReturn<ComponentHandle[]>;
990
1007
  /**
991
- * Place a catalog **door or window** into a host wall with optional size overrides.
1008
+ * Cut a **void** — a hole, opening or shaft — through an existing FLAT slab,
1009
+ * floor, roof or ceiling. The void is a selectable child object of its host
1010
+ * (the "Void" of the Draw Void tool). It always cuts the full host thickness.
1011
+ * It can be moved with `design.transform.move` (a move that would leave the
1012
+ * host is shortened without a report) and removed with
1013
+ * `design.delete.entities`; to resize, delete it and cut a new one
1014
+ * (`design.update.space` refuses a void).
1015
+ *
1016
+ * Give the outline **in plan** (all points at one height): its height is
1017
+ * ignored, and it is dropped straight onto the host's top face, so one outline
1018
+ * works on every storey. Keep it at least 25.4 mm (0.1 SU) inside the host
1019
+ * edge and away from other voids; merge overlapping holes into one outline.
1020
+ * Straight segments and arcs only (no splines).
1021
+ *
1022
+ * **A room has a floor finish AND a structural slab that overlap in plan; a
1023
+ * void in one does not cut the other, so a through-opening needs one void in
1024
+ * each.**
1025
+ *
1026
+ * `getEntityType` reports a void as `"mass"`, and `listMasses` /
1027
+ * `listByType("mass")` include voids: a mass whose `design.query.getHost` is a
1028
+ * slab, floor, roof or ceiling is a void. After its host is copied, a void can
1029
+ * report `null` and be missing from those lists; `listChildren(host)` still
1030
+ * finds it.
1031
+ *
1032
+ * Call it as `snaptrude.design.create.void(...)`; `void` is a reserved word and
1033
+ * cannot be destructured. Voids in walls, on sloped, generated or multi-plane
1034
+ * roofs, and on instanced hosts are not available yet; for a door or window
1035
+ * use `design.create.door` / `window`. To make a NEW slab that already has a
1036
+ * fixed hole, pass a contour with holes to `design.create.slab`; that hole is
1037
+ * part of the footprint, not an object. For a contour's outer loop, pass
1038
+ * `core.geom.query.contour.getOuterProfile(contour)`.
1039
+ *
1040
+ * # Example
1041
+ * ```ts
1042
+ * const m = 1000 / 254 // metres → Snaptrude units (SU)
1043
+ * const [slab] = await snaptrude.design.query.listByType("slab", { isSelected: true })
1044
+ * const center = await snaptrude.core.math.vec3.new(10 * m, 0, 5 * m) // plan point; y is ignored
1045
+ * const outline = await snaptrude.core.geom.create.profileRect(2 * m, 2 * m, center) // 2 m x 2 m
1046
+ * const hole = await snaptrude.design.create.void(slab, outline)
1047
+ * ```
1048
+ *
1049
+ * A round hole is two arcs (a circle handle is not a profile):
1050
+ * ```ts
1051
+ * const m = 1000 / 254
1052
+ * const { vec3 } = snaptrude.core.math
1053
+ * const g = snaptrude.core.geom.create
1054
+ * const r = 0.5 * m // 1 m diameter
1055
+ * const centre = await vec3.new(10 * m, 0, 5 * m)
1056
+ * const axis = await vec3.new(0, -1, 0)
1057
+ * const east = await vec3.new(10 * m + r, 0, 5 * m)
1058
+ * const west = await vec3.new(10 * m - r, 0, 5 * m)
1059
+ * const round = await g.profileFromCurves([await g.arc(east, west, centre, axis), await g.arc(west, east, centre, axis)])
1060
+ * await snaptrude.design.create.void(slab, round) // never destructure `void`
1061
+ * ```
1062
+ *
1063
+ * @param host - The slab, floor, roof or ceiling to cut through
1064
+ * @param outline - Closed, flat plan outline (world SU); its height is ignored
1065
+ * @returns the {@linkcode ComponentHandle} of the new void
1066
+ * @throws `VALIDATION` if the outline is open, crosses itself, is not flat or
1067
+ * has a spline, or the arguments are the wrong handle kinds or swapped;
1068
+ * `HANDLE_INVALID` if a handle is unknown or released or the host was
1069
+ * deleted; `HANDLE_STALE` if the host was rebuilt (re-query it);
1070
+ * `PRECONDITION_FAILED` if the
1071
+ * host is a wall or not a slab/floor/roof/ceiling, is sloped, instanced, in
1072
+ * another building, locked, outside the active proposal, a generated roof or
1073
+ * not a single plate, or there is no active structure (`engineCode`
1074
+ * `NO_ACTIVE_STRUCTURE`); `OPERATION_FAILED` with `engineCode`
1075
+ * `VOID_DOES_NOT_FIT` when the outline crosses the host edge, overlaps a void
1076
+ * or hole, is closer than 25.4 mm to either, or the fit could not be checked,
1077
+ * or another `engineCode` when the cut failed (nothing is created, except
1078
+ * `PUBLISH_FAILED` with a hint that the voids are in the scene: undo, then
1079
+ * retry); `METHOD_NOT_PERMITTED` if the plugin may not write.
1080
+ *
1081
+ * @examplePrompt Cut a hole in this slab
1082
+ * @examplePrompt Add a 1.2m by 2.4m stair opening in the first-floor slab
1083
+ * @examplePrompt Make a 600 x 600 service penetration in the floor for the riser
1084
+ * @examplePrompt Put a skylight opening through the roof
1085
+ * @examplePrompt Cut a round 1m duct hole in the slab
1086
+ * @examplePrompt Make a cut-out in the ceiling for the light well
1087
+ * @examplePrompt Add a double-height atrium void in the level 2 floor
1088
+ *
1089
+ * @performance Single-void creator. For MORE THAN ONE void, call
1090
+ * `design.create.voids(items[])`: one host round-trip, ONE undo entry, one cut
1091
+ * per host.
1092
+ */
1093
+ abstract void(host: ComponentHandle, outline: ProfileHandle): PluginApiReturn<ComponentHandle>;
1094
+ /**
1095
+ * Cut **many voids** (holes, openings, shafts) through slabs, floors, roofs
1096
+ * and ceilings in one undoable operation (bulk plural of {@linkcode void}).
1097
+ * Items may share a host or use different hosts — one shaft outline on every
1098
+ * storey's slab AND floor is one call. Validate-all-or-throw: one item whose
1099
+ * host does not contain the outline rejects the whole batch, so pass only the
1100
+ * hosts that contain it; `details.itemIndex` names the failing item (for two
1101
+ * overlapping items of the batch, the earlier one). At most 50 voids per host
1102
+ * and 200 in all per call. Same outline rules as {@linkcode void}: plan outline, 25.4 mm
1103
+ * (0.1 SU) clearance, floor AND slab are separate hosts. Call it as
1104
+ * `snaptrude.design.create.voids(...)`.
1105
+ *
1106
+ * # Example
1107
+ * ```ts
1108
+ * const m = 1000 / 254
1109
+ * // The user selects the slabs AND floors the shaft passes through; every one must contain the outline.
1110
+ * const hosts = [
1111
+ * ...(await snaptrude.design.query.listByType("slab", { isSelected: true })),
1112
+ * ...(await snaptrude.design.query.listByType("floor", { isSelected: true })),
1113
+ * ]
1114
+ * const centre = await snaptrude.core.math.vec3.new(12 * m, 0, -6 * m)
1115
+ * const shaft = await snaptrude.core.geom.create.profileRect(2 * m, 2 * m, centre)
1116
+ * const holes = await snaptrude.design.create.voids(hosts.map((host) => ({ host, outline: shaft })))
1117
+ * ```
1118
+ *
1119
+ * @param items - One {@linkcode PluginCreateVoidItem} per void (≥1, ≤200; ≤50 per host)
1120
+ * @returns the new voids as {@linkcode ComponentHandle}`[]`, in input order
1121
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
1122
+ * 1000 items, unknown fields), an outline is invalid (as for
1123
+ * {@linkcode void}), more than 50 items share one host, or there are more
1124
+ * than 200 items; plus every code {@linkcode void} throws, each with
1125
+ * `details.itemIndex`. Nothing is created on any failure, except
1126
+ * `PUBLISH_FAILED` (as for {@linkcode void}).
1127
+ *
1128
+ * @examplePrompt Cut a lift shaft through every floor slab of the core
1129
+ * @examplePrompt Cut a 2m x 2m shaft through all the slabs at this location
1130
+ * @examplePrompt Make stair openings in all the floors above the staircases
1131
+ * @examplePrompt Make holes in the roof for these three skylights
1132
+ * @examplePrompt Cut openings in each storey's slab matching this outline
1133
+ * @examplePrompt Punch the same riser penetration through every floor at once
1134
+ *
1135
+ * @performance ONE host round-trip, ONE undo entry, ONE cut per host. Never call
1136
+ * `void` in a loop. Runs synchronously on the main thread: 50 voids on one
1137
+ * host take about 1 s, and the time grows with the number of hosts (caps:
1138
+ * 50 per host, 200 per call).
1139
+ */
1140
+ abstract voids(items: PluginCreateVoidItem[]): PluginApiReturn<ComponentHandle[]>;
1141
+ /**
1142
+ * Place a parametric **door or window** into a host wall with parameter overrides.
992
1143
  *
993
1144
  * The world `position` is projected onto the host wall to locate the opening.
994
1145
  * All supplied dimensions use Snaptrude engine units. Window `sillHeight` is
995
1146
  * measured from the host wall base to the bottom of the window, not to
996
1147
  * its center. Placement is asynchronous and committed as one undoable creation.
997
1148
  *
998
- * @param options - Opening kind, catalog and host references, placement, and
1149
+ * Wall only. For a hole in a slab, floor or roof use `design.create.void`.
1150
+ *
1151
+ * @param options - Opening kind, family and host references, placement, and
999
1152
  * optional facing (swing side), hinge (hinged jamb), label, and dimensions
1000
1153
  * @returns the {@linkcode ComponentHandle} of the placed door or window
1001
- * @throws if the options are invalid, the catalog id is unknown, the host is
1154
+ * @throws if the options are invalid, the family id is unknown, the host is
1002
1155
  * not a wall, loading fails, or the opening cannot be placed on the host
1003
1156
  *
1004
1157
  * @examplePrompt Add a 1m wide door to this wall here
@@ -1012,7 +1165,7 @@ export declare abstract class PluginDesignCreateApi {
1012
1165
  * ```ts
1013
1166
  * const opening = await snaptrude.design.create.opening({
1014
1167
  * kind: "window",
1015
- * catalogId: windowType.id,
1168
+ * familyId: windowType.id,
1016
1169
  * hostWall: wall,
1017
1170
  * position: await snaptrude.core.math.vec3.new(3, 0, 5),
1018
1171
  * width: 1.2,
@@ -1465,7 +1618,7 @@ export type PluginDesignCreateBeamArgs = z.infer<typeof PluginDesignCreateBeamAr
1465
1618
  * | `profile` | {@linkcode ProfileHandle} | Ordered curve chain (wall centerlines) |
1466
1619
  * | `height` | `number`? | Wall height (default engine default) |
1467
1620
  * | `thickness` | `number`? | Wall thickness (default: `wallType`'s total layer thickness when given, else engine default) |
1468
- * | `wallType` | `string`? | Wall type name from `design.types.list("wall")` — layers/material/thickness defaults (default generic) |
1621
+ * | `wallType` | {@linkcode PluginWallType}? | Legacy name/id or exact native `{ id, version }` pin from `design.types.list("wall")` (default generic) |
1469
1622
  * | `storey` | `number`? | Target storey (integer, must exist) — walls assigned + lifted to its base in the same undo entry (default: geometry-derived) |
1470
1623
  * | `topProfiles` | ({@linkcode PluginWallTopProfile} \| `null`)[]? | Top edge per curve (same order); `null`/missing = flat at `height`. Straight curves only |
1471
1624
  */
@@ -1473,12 +1626,16 @@ export declare const PluginDesignCreateWallsArgs: z.ZodObject<{
1473
1626
  profile: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"profile">, string>>;
1474
1627
  height: z.ZodOptional<z.ZodNumber>;
1475
1628
  thickness: z.ZodOptional<z.ZodNumber>;
1476
- wallType: z.ZodOptional<z.ZodString>;
1629
+ wallType: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
1630
+ id: z.ZodString;
1631
+ version: z.ZodNumber;
1632
+ }, z.core.$strip>]>>;
1477
1633
  storey: z.ZodOptional<z.ZodNumber>;
1478
1634
  topProfiles: z.ZodOptional<z.ZodArray<z.ZodNullable<z.ZodArray<z.ZodObject<{
1479
1635
  along: z.ZodNumber;
1480
1636
  height: z.ZodNumber;
1481
1637
  }, z.core.$strip>>>>>;
1638
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString, z.ZodBoolean]>>>;
1482
1639
  }, z.core.$strip>;
1483
1640
  export type PluginDesignCreateWallsArgs = z.infer<typeof PluginDesignCreateWallsArgs>;
1484
1641
  /**
@@ -1549,20 +1706,26 @@ export type PluginDesignCreateFurnitureArgs = z.infer<typeof PluginDesignCreateF
1549
1706
  *
1550
1707
  * | Property | Type | Description |
1551
1708
  * |---|---|---|
1552
- * | `catalogId` | `string` | Library id: team `_id` or general `fullName` |
1709
+ * | `familyId` | `string` | Hosted door family definition ID |
1710
+ * | `version` | `number`? | Exact version; newest known by default |
1711
+ * | `values` | `Record<string, number \| string>`? | Parameters; numeric lengths use SU |
1553
1712
  * | `hostWall` | {@linkcode ComponentHandle} | The wall to host the door |
1554
1713
  * | `position` | {@linkcode Vec3Handle} | World point projected onto the wall |
1555
1714
  * | `label` | `string`? | Instance name (optional) |
1556
1715
  * | `facing` | {@linkcode Vec3Handle}? | World point on the side of the wall the door swings open to (default engine-chosen) |
1557
- * | `hinge` | {@linkcode Vec3Handle}? | World point near the jamb the door is hinged on (default the catalog item's authored side) |
1716
+ * | `hinge` | {@linkcode Vec3Handle}? | World point near the hinged jamb; requires hand control |
1558
1717
  */
1559
1718
  export declare const PluginDesignCreateDoorArgs: z.ZodObject<{
1560
- catalogId: z.ZodString;
1719
+ familyId: z.ZodString;
1720
+ version: z.ZodOptional<z.ZodNumber>;
1721
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
1561
1722
  hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1562
1723
  position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1563
- label: z.ZodOptional<z.ZodString>;
1564
1724
  facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1565
1725
  hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1726
+ label: z.ZodOptional<z.ZodString>;
1727
+ width: z.ZodOptional<z.ZodNumber>;
1728
+ height: z.ZodOptional<z.ZodNumber>;
1566
1729
  }, z.core.$strip>;
1567
1730
  export type PluginDesignCreateDoorArgs = z.infer<typeof PluginDesignCreateDoorArgs>;
1568
1731
  /**
@@ -1570,20 +1733,26 @@ export type PluginDesignCreateDoorArgs = z.infer<typeof PluginDesignCreateDoorAr
1570
1733
  *
1571
1734
  * | Property | Type | Description |
1572
1735
  * |---|---|---|
1573
- * | `catalogId` | `string` | Library id: team `_id` or general `fullName` |
1736
+ * | `familyId` | `string` | Hosted window family definition ID |
1737
+ * | `version` | `number`? | Exact version; newest known by default |
1738
+ * | `values` | `Record<string, number \| string>`? | Parameters; numeric lengths use SU |
1574
1739
  * | `hostWall` | {@linkcode ComponentHandle} | The wall to host the window |
1575
1740
  * | `position` | {@linkcode Vec3Handle} | World point projected onto the wall |
1576
1741
  * | `label` | `string`? | Instance name (optional) |
1577
1742
  * | `facing` | {@linkcode Vec3Handle}? | World point on the side of the wall the window opens to (default engine-chosen) |
1578
- * | `hinge` | {@linkcode Vec3Handle}? | World point near the jamb the window is hinged on (default the catalog item's authored side) |
1743
+ * | `hinge` | {@linkcode Vec3Handle}? | World point near the hinged jamb; requires hand control |
1579
1744
  */
1580
1745
  export declare const PluginDesignCreateWindowArgs: z.ZodObject<{
1581
- catalogId: z.ZodString;
1746
+ familyId: z.ZodString;
1747
+ version: z.ZodOptional<z.ZodNumber>;
1748
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
1582
1749
  hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1583
1750
  position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1584
- label: z.ZodOptional<z.ZodString>;
1585
1751
  facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1586
1752
  hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1753
+ label: z.ZodOptional<z.ZodString>;
1754
+ width: z.ZodOptional<z.ZodNumber>;
1755
+ height: z.ZodOptional<z.ZodNumber>;
1587
1756
  }, z.core.$strip>;
1588
1757
  export type PluginDesignCreateWindowArgs = z.infer<typeof PluginDesignCreateWindowArgs>;
1589
1758
  /**
@@ -1593,7 +1762,9 @@ export type PluginDesignCreateWindowArgs = z.infer<typeof PluginDesignCreateWind
1593
1762
  * the distance from the host wall base to the bottom of the window.
1594
1763
  */
1595
1764
  export declare const PluginDesignCreateOpeningOptions: z.ZodDiscriminatedUnion<[z.ZodObject<{
1596
- catalogId: z.ZodString;
1765
+ familyId: z.ZodString;
1766
+ version: z.ZodOptional<z.ZodNumber>;
1767
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
1597
1768
  hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1598
1769
  position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1599
1770
  facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
@@ -1604,7 +1775,9 @@ export declare const PluginDesignCreateOpeningOptions: z.ZodDiscriminatedUnion<[
1604
1775
  kind: z.ZodLiteral<"door">;
1605
1776
  }, z.core.$strict>, z.ZodObject<{
1606
1777
  sillHeight: z.ZodOptional<z.ZodNumber>;
1607
- catalogId: z.ZodString;
1778
+ familyId: z.ZodString;
1779
+ version: z.ZodOptional<z.ZodNumber>;
1780
+ values: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>>>;
1608
1781
  hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1609
1782
  position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1610
1783
  facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;