@snaptrude/plugin-core 0.9.16 → 0.9.18-edgesetbacks-20261021.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 (221) hide show
  1. package/AGENTS.md +231 -231
  2. package/CHANGELOG.md +408 -402
  3. package/CLAUDE.md +11 -11
  4. package/api-manifest.json +1510 -701
  5. package/dist/api/analysis/daylight.d.ts +5 -5
  6. package/dist/api/analysis/solar.d.ts +2 -2
  7. package/dist/api/core/camera/index.d.ts +29 -0
  8. package/dist/api/core/camera/index.d.ts.map +1 -1
  9. package/dist/api/core/geom/create/index.d.ts +7 -1
  10. package/dist/api/core/geom/create/index.d.ts.map +1 -1
  11. package/dist/api/core/geom/update/contour.d.ts +8 -2
  12. package/dist/api/core/geom/update/contour.d.ts.map +1 -1
  13. package/dist/api/core/storeys/index.d.ts +5 -2
  14. package/dist/api/core/storeys/index.d.ts.map +1 -1
  15. package/dist/api/core/zoom/index.d.ts +13 -0
  16. package/dist/api/core/zoom/index.d.ts.map +1 -1
  17. package/dist/api/design/bim.d.ts +299 -0
  18. package/dist/api/design/bim.d.ts.map +1 -0
  19. package/dist/api/design/boolean/index.d.ts +2 -0
  20. package/dist/api/design/boolean/index.d.ts.map +1 -1
  21. package/dist/api/design/catalog.d.ts +320 -0
  22. package/dist/api/design/catalog.d.ts.map +1 -0
  23. package/dist/api/design/create/bulk-items.d.ts +65 -25
  24. package/dist/api/design/create/bulk-items.d.ts.map +1 -1
  25. package/dist/api/design/create/index.d.ts +299 -100
  26. package/dist/api/design/create/index.d.ts.map +1 -1
  27. package/dist/api/design/create/opening-fields.d.ts +13 -12
  28. package/dist/api/design/create/opening-fields.d.ts.map +1 -1
  29. package/dist/api/design/delete/index.d.ts +1 -0
  30. package/dist/api/design/delete/index.d.ts.map +1 -1
  31. package/dist/api/design/doors/index.d.ts +18 -24
  32. package/dist/api/design/doors/index.d.ts.map +1 -1
  33. package/dist/api/design/family.d.ts +813 -35
  34. package/dist/api/design/family.d.ts.map +1 -1
  35. package/dist/api/design/index.d.ts +16 -0
  36. package/dist/api/design/index.d.ts.map +1 -1
  37. package/dist/api/design/networks.d.ts +1703 -0
  38. package/dist/api/design/networks.d.ts.map +1 -0
  39. package/dist/api/design/query/grids.d.ts +2 -2
  40. package/dist/api/design/query/index.d.ts +42 -32
  41. package/dist/api/design/query/index.d.ts.map +1 -1
  42. package/dist/api/design/selection/index.d.ts +10 -10
  43. package/dist/api/design/types/index.d.ts +40 -24
  44. package/dist/api/design/types/index.d.ts.map +1 -1
  45. package/dist/api/design/update/index.d.ts +111 -6
  46. package/dist/api/design/update/index.d.ts.map +1 -1
  47. package/dist/api/design/windows/index.d.ts +8 -8
  48. package/dist/api/design/windows/index.d.ts.map +1 -1
  49. package/dist/api/entity/buildableEnvelope.d.ts +84 -2
  50. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -1
  51. package/dist/api/presentation/aiInspiration.d.ts +10 -10
  52. package/dist/api/presentation/annotate.d.ts +38 -22
  53. package/dist/api/presentation/annotate.d.ts.map +1 -1
  54. package/dist/api/presentation/drawingContract.d.ts +32 -0
  55. package/dist/api/presentation/drawingContract.d.ts.map +1 -0
  56. package/dist/api/presentation/drawings.d.ts +3523 -0
  57. package/dist/api/presentation/drawings.d.ts.map +1 -0
  58. package/dist/api/presentation/export.d.ts +23 -5
  59. package/dist/api/presentation/export.d.ts.map +1 -1
  60. package/dist/api/presentation/index.d.ts +41 -12
  61. package/dist/api/presentation/index.d.ts.map +1 -1
  62. package/dist/api/presentation/placedViews.d.ts +106 -6
  63. package/dist/api/presentation/placedViews.d.ts.map +1 -1
  64. package/dist/api/presentation/sections.d.ts +461 -0
  65. package/dist/api/presentation/sections.d.ts.map +1 -0
  66. package/dist/api/presentation/shapes.d.ts +2 -2
  67. package/dist/api/presentation/sheets.d.ts +175 -19
  68. package/dist/api/presentation/sheets.d.ts.map +1 -1
  69. package/dist/api/presentation/viewPresets.d.ts +222 -0
  70. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  71. package/dist/api/presentation/views.d.ts +141 -8
  72. package/dist/api/presentation/views.d.ts.map +1 -1
  73. package/dist/api/presentation/walkthroughs.d.ts +6 -6
  74. package/dist/errors/codes.d.ts +3 -1
  75. package/dist/errors/codes.d.ts.map +1 -1
  76. package/dist/index.cjs +3883 -2385
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.js +3744 -2385
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
  81. package/scripts/check-dist-fresh.mjs +22 -22
  82. package/scripts/generate-manifest.mjs +243 -238
  83. package/scripts/generate-manifest.test.mjs +303 -303
  84. package/src/api/analysis/daylight.ts +470 -470
  85. package/src/api/analysis/heatmaps.ts +683 -683
  86. package/src/api/analysis/illuminance.ts +155 -155
  87. package/src/api/analysis/index.ts +61 -61
  88. package/src/api/analysis/shadows.ts +183 -183
  89. package/src/api/analysis/solar.ts +237 -237
  90. package/src/api/analysis/sunlightHours.ts +211 -211
  91. package/src/api/analysis/sunpath.ts +83 -83
  92. package/src/api/analysis/weather.ts +179 -179
  93. package/src/api/core/buildings.ts +485 -485
  94. package/src/api/core/camera/index.ts +696 -667
  95. package/src/api/core/comment/index.ts +376 -376
  96. package/src/api/core/geom/create/index.ts +2139 -2133
  97. package/src/api/core/geom/delete/index.ts +84 -84
  98. package/src/api/core/geom/index.ts +35 -35
  99. package/src/api/core/geom/query/arc.ts +169 -169
  100. package/src/api/core/geom/query/brep.ts +621 -621
  101. package/src/api/core/geom/query/circle.ts +404 -404
  102. package/src/api/core/geom/query/contour.ts +540 -540
  103. package/src/api/core/geom/query/curve.ts +1102 -1102
  104. package/src/api/core/geom/query/edge.ts +130 -130
  105. package/src/api/core/geom/query/face.ts +508 -508
  106. package/src/api/core/geom/query/halfedge.ts +210 -210
  107. package/src/api/core/geom/query/index.ts +63 -63
  108. package/src/api/core/geom/query/profile.ts +473 -473
  109. package/src/api/core/geom/query/vertex.ts +205 -205
  110. package/src/api/core/geom/update/contour.ts +323 -317
  111. package/src/api/core/geom/update/curve.ts +209 -209
  112. package/src/api/core/geom/update/index.ts +29 -29
  113. package/src/api/core/geom/update/profile.ts +379 -379
  114. package/src/api/core/groups.ts +521 -521
  115. package/src/api/core/handles/index.ts +234 -234
  116. package/src/api/core/history/index.ts +84 -84
  117. package/src/api/core/index.ts +99 -99
  118. package/src/api/core/io/export/index.ts +126 -126
  119. package/src/api/core/io/import/index.ts +504 -504
  120. package/src/api/core/io/index.ts +42 -42
  121. package/src/api/core/io/job/index.ts +140 -140
  122. package/src/api/core/io/query/index.ts +71 -71
  123. package/src/api/core/io/terrain/index.ts +360 -360
  124. package/src/api/core/io/underlay/index.ts +705 -705
  125. package/src/api/core/layers.ts +540 -540
  126. package/src/api/core/math/index.ts +20 -20
  127. package/src/api/core/math/quat.ts +172 -172
  128. package/src/api/core/math/vec3.ts +179 -179
  129. package/src/api/core/mode/index.ts +108 -108
  130. package/src/api/core/project/index.ts +479 -479
  131. package/src/api/core/proposals/index.ts +570 -570
  132. package/src/api/core/storeys/index.ts +311 -308
  133. package/src/api/core/storeys/layers.ts +339 -339
  134. package/src/api/core/tags.ts +911 -911
  135. package/src/api/core/units/index.ts +164 -164
  136. package/src/api/core/user.ts +46 -46
  137. package/src/api/core/zoom/index.ts +64 -51
  138. package/src/api/design/bim.ts +210 -0
  139. package/src/api/design/boolean/index.ts +181 -179
  140. package/src/api/design/catalog.ts +203 -0
  141. package/src/api/design/create/bulk-items.ts +294 -254
  142. package/src/api/design/create/grids.ts +137 -137
  143. package/src/api/design/create/index.ts +2178 -1980
  144. package/src/api/design/create/opening-fields.ts +40 -37
  145. package/src/api/design/delete/index.ts +75 -74
  146. package/src/api/design/dimensions.ts +453 -453
  147. package/src/api/design/doors/index.ts +516 -500
  148. package/src/api/design/edit/index.ts +54 -54
  149. package/src/api/design/erase/index.ts +151 -151
  150. package/src/api/design/family.ts +1342 -704
  151. package/src/api/design/furniture/index.ts +319 -319
  152. package/src/api/design/grids.ts +237 -237
  153. package/src/api/design/index.ts +304 -274
  154. package/src/api/design/lock.ts +69 -69
  155. package/src/api/design/materials/index.ts +608 -608
  156. package/src/api/design/networks.ts +607 -0
  157. package/src/api/design/query/geometry/index.ts +319 -319
  158. package/src/api/design/query/grids.ts +197 -197
  159. package/src/api/design/query/index.ts +1236 -1226
  160. package/src/api/design/query/referenceLines.ts +52 -52
  161. package/src/api/design/query/spaces.ts +275 -275
  162. package/src/api/design/selection/index.ts +273 -273
  163. package/src/api/design/shared.ts +40 -40
  164. package/src/api/design/transform/index.ts +254 -254
  165. package/src/api/design/types/index.ts +163 -156
  166. package/src/api/design/update/index.ts +1096 -983
  167. package/src/api/design/visibility.ts +143 -143
  168. package/src/api/design/windows/index.ts +351 -333
  169. package/src/api/entity/buildableEnvelope.ts +397 -322
  170. package/src/api/entity/index.ts +30 -30
  171. package/src/api/entity/referenceLine.ts +235 -235
  172. package/src/api/entity/space.ts +612 -612
  173. package/src/api/entity/story.ts +517 -517
  174. package/src/api/index.ts +47 -47
  175. package/src/api/presentation/aiInspiration.ts +1116 -1116
  176. package/src/api/presentation/annotate.ts +417 -385
  177. package/src/api/presentation/camera.ts +289 -289
  178. package/src/api/presentation/diagrams.ts +194 -194
  179. package/src/api/presentation/drawingContract.ts +70 -0
  180. package/src/api/presentation/drawings.ts +1179 -0
  181. package/src/api/presentation/export.ts +134 -108
  182. package/src/api/presentation/import.ts +159 -159
  183. package/src/api/presentation/index.ts +160 -126
  184. package/src/api/presentation/placedViews.ts +1211 -1120
  185. package/src/api/presentation/sections.ts +420 -0
  186. package/src/api/presentation/shapes.ts +274 -274
  187. package/src/api/presentation/sheets.ts +746 -585
  188. package/src/api/presentation/slideshow.ts +134 -134
  189. package/src/api/presentation/tables.ts +84 -84
  190. package/src/api/presentation/viewPresets.ts +241 -0
  191. package/src/api/presentation/views.ts +742 -673
  192. package/src/api/presentation/walkthroughs.ts +1201 -1201
  193. package/src/api/program/adjacency.ts +164 -164
  194. package/src/api/program/areas.ts +408 -408
  195. package/src/api/program/classification.ts +138 -138
  196. package/src/api/program/cores.ts +83 -83
  197. package/src/api/program/departments.ts +517 -517
  198. package/src/api/program/index.ts +73 -73
  199. package/src/api/program/labels.ts +332 -332
  200. package/src/api/program/layout.ts +422 -422
  201. package/src/api/program/metadata.ts +364 -364
  202. package/src/api/program/metrics.ts +120 -120
  203. package/src/api/program/site.ts +748 -748
  204. package/src/api/program/spreadsheet.ts +2698 -2698
  205. package/src/api/workspace/index.ts +612 -612
  206. package/src/errors/codes.ts +143 -136
  207. package/src/errors/envelope.ts +75 -75
  208. package/src/errors/index.ts +21 -21
  209. package/src/errors/plugin-error.ts +134 -134
  210. package/src/handles.ts +297 -297
  211. package/src/host-utils.ts +67 -67
  212. package/src/index.ts +7 -7
  213. package/src/massParameters.ops.ts +246 -246
  214. package/src/massParameters.ts +427 -427
  215. package/src/types.ts +16 -16
  216. package/test/drawingContract.test.mjs +288 -0
  217. package/test/errors.test.mjs +185 -184
  218. package/test/massParameters.test.mjs +952 -952
  219. package/test/presentationViewSettings.test.mjs +85 -0
  220. package/tsconfig.json +22 -22
  221. package/tsup.config.ts +12 -12
@@ -1,319 +1,319 @@
1
- import * as z from "zod"
2
- import { PluginApiReturn } from "../../../types"
3
- import { ComponentHandle } from "../../../handles"
4
- import { PluginDesignChangeResult } from "../lock"
5
- import { PluginObjectCatalogGroup } from "../doors"
6
-
7
- /**
8
- * `snaptrude.design.furniture` — the placeable furniture **catalog** (a library of
9
- * source items, NOT scene entities) plus dimension reads/edits of PLACED furniture.
10
- * Placement lives at `design.create.furniture` (returns a {@linkcode ComponentHandle});
11
- * generic reads of placed furniture live at `design.query.listFurniture`/`getProperties`.
12
- *
13
- * Catalog items are plain value records ({@linkcode PluginFurnitureCatalogItem}) keyed
14
- * by a library id (team `_id` or general `fullName`) — not handles. Reads are async
15
- * (network-backed) but carry no `Async` suffix (§6.6).
16
- *
17
- * {@linkcode PluginDesignFurnitureApi.getDimensions} / {@linkcode PluginDesignFurnitureApi.setDimensions}
18
- * target a PLACED furniture {@linkcode ComponentHandle} (not a catalog id) — `length`
19
- * along the object, `width` across it, `height` up. Values are engine units, matching
20
- * the length/width/height fields the furniture properties panel shows.
21
- */
22
- export abstract class PluginDesignFurnitureApi {
23
- constructor() {}
24
-
25
- /**
26
- * Get the dimensions of a PLACED furniture item — `length` (along the object),
27
- * `width` (across it) and `height` (vertical), in engine units. Mirrors the
28
- * Length/Width/Height fields of the furniture properties panel.
29
- *
30
- * @param item The placed furniture to query
31
- * @returns The dimensions, or `null` if the geometry is degenerate
32
- *
33
- * @examplePrompt How big is this sofa?
34
- * @examplePrompt What are the dimensions of the selected furniture?
35
- * @examplePrompt Measure the length, width and height of this table
36
- * @examplePrompt Get the size of the chair I just placed
37
- *
38
- * # Example
39
- * ```ts
40
- * const [item] = await snaptrude.design.query.listFurniture({ isSelected: true })
41
- * const dims = await snaptrude.design.furniture.getDimensions(item)
42
- * if (dims) console.log(dims.length, dims.width, dims.height)
43
- * ```
44
- */
45
- public abstract getDimensions(
46
- item: ComponentHandle
47
- ): PluginApiReturn<PluginFurnitureDimensions | null>
48
-
49
- /**
50
- * Resize a PLACED furniture item along one or more axes — `length`, `width`
51
- * and/or `height` (engine units). Omitted axes are left unchanged. Each supplied
52
- * axis is an undoable command, mirroring editing the furniture properties panel.
53
- *
54
- * @param item The placed furniture to resize
55
- * @param dimensions New `length` / `width` / `height` (each optional, engine units)
56
- * @returns The affected furniture
57
- *
58
- * @examplePrompt Make this table 1.8m long
59
- * @examplePrompt Resize the selected sofa to 2000 wide
60
- * @examplePrompt Set this furniture to 800mm tall
61
- * @examplePrompt Change the desk to 1500 long and 700 deep
62
- *
63
- * # Example
64
- * ```ts
65
- * const [item] = await snaptrude.design.query.listFurniture({ isSelected: true })
66
- * const { affected } = await snaptrude.design.furniture.setDimensions(item, {
67
- * length: 1800,
68
- * height: 750
69
- * })
70
- * ```
71
- */
72
- public abstract setDimensions(
73
- item: ComponentHandle,
74
- dimensions: PluginFurnitureDimensionUpdates
75
- ): PluginApiReturn<PluginDesignChangeResult>
76
-
77
- /**
78
- * List the categories (Living, Bedroom, Kitchen, …) that organize the
79
- * furniture catalog — the picker taxonomy, merged from built-in categories,
80
- * team types, and backend user types. Pass a value to
81
- * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `category` filter.
82
- * @returns The category names (`[]` when empty)
83
- *
84
- * @examplePrompt What furniture categories are available?
85
- * @examplePrompt List the furniture categories
86
- * @examplePrompt Show me the furniture groups like living and bedroom
87
- * @examplePrompt Which furniture categories can I filter by?
88
- *
89
- * # Example
90
- * ```ts
91
- * const categories = await snaptrude.design.furniture.listCategories()
92
- * const [first] = categories
93
- * const items = await snaptrude.design.furniture.listCatalog(undefined, first)
94
- * console.log(first, "→", items.length, "items")
95
- * ```
96
- *
97
- * @deprecated Use `design.furniture.listCatalogGroups` — the same name
98
- * `design.doors` and `design.windows` use. Still supported.
99
- */
100
- public abstract listCategories(): PluginApiReturn<string[]>
101
-
102
- /**
103
- * List the furniture catalog's groups. Matches
104
- * {@linkcode PluginDesignDoorsApi.listCatalogGroups} and
105
- * {@linkcode PluginDesignWindowsApi.listCatalogGroups}, so all three catalog
106
- * surfaces are named alike.
107
- *
108
- * `source` is `"default"` for the built-in picker groups and `"team"` for the
109
- * sub-types of THIS project's team library — exactly the split
110
- * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `source` filter uses, so
111
- * every `"team"` group is guaranteed to match at least one team item here.
112
- * For furniture the group token and its label are the same string (the
113
- * category), so `dbType === label`; `design.doors`/`design.windows` have a
114
- * distinct engine `dbType`.
115
- *
116
- * @returns The catalog groups as {@linkcode PluginObjectCatalogGroup}`[]`
117
- * (`[]` when empty). Pass a group's `dbType` (=== `label`) to
118
- * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `category` filter to
119
- * list its items.
120
- *
121
- * @examplePrompt What furniture groups are available?
122
- * @examplePrompt List the furniture categories in this project
123
- *
124
- * # Example
125
- * ```ts
126
- * const groups = await snaptrude.design.furniture.listCatalogGroups()
127
- * for (const g of groups) console.log(g.dbType, g.label, g.source)
128
- * ```
129
- */
130
- public abstract listCatalogGroups(): PluginApiReturn<PluginObjectCatalogGroup[]>
131
-
132
- /**
133
- * List the placeable furniture catalog (team + general libraries),
134
- * optionally filtered by library `source` and/or `category`.
135
- * @param source Restrict to one library (optional)
136
- * @param category Restrict to one category (optional; see {@linkcode PluginDesignFurnitureApi.listCategories})
137
- * @returns The catalog as {@linkcode PluginFurnitureCatalogItem}`[]` (`[]` when empty)
138
- *
139
- * @examplePrompt What furniture can I place in this project?
140
- * @examplePrompt Show me all the furniture available in the library
141
- * @examplePrompt List the chairs and tables I can add to the model
142
- * @examplePrompt Which furniture items are in my team's library?
143
- * @examplePrompt Show me the bedroom furniture I can place
144
- *
145
- * # Example
146
- * ```ts
147
- * const bedroom = await snaptrude.design.furniture.listCatalog("team", "bedroom")
148
- * for (const item of bedroom) console.log(item.id, item.name, item.thumbnailUrl)
149
- * ```
150
- */
151
- public abstract listCatalog(
152
- source?: "team" | "general",
153
- category?: string
154
- ): PluginApiReturn<PluginFurnitureCatalogItem[]>
155
-
156
- /**
157
- * Get a single catalog item by its library id.
158
- * @param id The catalog library id
159
- * @returns The item, or `null` if no catalog item matches
160
- *
161
- * @examplePrompt Get the details of this furniture item from the library
162
- * @examplePrompt Look up the catalog entry for this chair id
163
- * @examplePrompt What is the cost of this furniture item?
164
- * @examplePrompt Show me the family name of the sofa in the catalog
165
- *
166
- * # Example
167
- * ```ts
168
- * const [entry] = await snaptrude.design.furniture.listCatalog()
169
- * const item = await snaptrude.design.furniture.getCatalogItem(entry.id)
170
- * if (item) console.log(item.name, item.source, item.familyName)
171
- * ```
172
- */
173
- public abstract getCatalogItem(
174
- id: string
175
- ): PluginApiReturn<PluginFurnitureCatalogItem | null>
176
-
177
- /**
178
- * Test whether a catalog item exists for the given library id.
179
- * @param id The catalog library id
180
- * @returns `true` if it exists, otherwise `false`
181
- *
182
- * @examplePrompt Is this furniture item still in the library?
183
- * @examplePrompt Check whether a catalog item with this id exists
184
- * @examplePrompt Does my team library have this chair?
185
- * @examplePrompt Verify the sofa is available in the catalog before placing it
186
- *
187
- * # Example
188
- * ```ts
189
- * const [entry] = await snaptrude.design.furniture.listCatalog()
190
- * const stillAvailable = await snaptrude.design.furniture.exists(entry.id)
191
- * console.log(stillAvailable ? "safe to place" : "removed from library")
192
- * ```
193
- */
194
- public abstract exists(id: string): PluginApiReturn<boolean>
195
- }
196
-
197
- /**
198
- * A placeable furniture catalog item (value record — not a scene entity/handle).
199
- *
200
- * | Property | Type | Description |
201
- * |---|---|---|
202
- * | `id` | `string` | Library id (team `_id` or general `fullName`) — pass to `design.create.furniture` |
203
- * | `name` | `string` | Display name |
204
- * | `source` | `'team' \| 'general'` | Which library it came from |
205
- * | `subType` | `string` | Sub-type (optional) |
206
- * | `category` | `string` | Category the item belongs to (optional) |
207
- * | `thumbnailUrl` | `string` | Preview thumbnail URL (optional; never the mesh URL) |
208
- * | `cost` | `number` | Cost (optional; team items) |
209
- * | `familyName` | `string` | Family name (optional) |
210
- */
211
- export const PluginFurnitureCatalogItem = z.object({
212
- id: z.string(),
213
- name: z.string(),
214
- source: z.enum(["team", "general"]),
215
- subType: z.string().optional(),
216
- category: z.string().optional(),
217
- thumbnailUrl: z.string().optional(),
218
- cost: z.number().optional(),
219
- familyName: z.string().optional(),
220
- })
221
- export type PluginFurnitureCatalogItem = z.infer<typeof PluginFurnitureCatalogItem>
222
-
223
- /**
224
- * Arguments for {@linkcode PluginDesignFurnitureApi.listCatalog}.
225
- *
226
- * | Property | Type | Description |
227
- * |---|---|---|
228
- * | `source` | `'team' \| 'general'` | Restrict to one library (optional) |
229
- * | `category` | `string` | Restrict to one category (optional) |
230
- */
231
- export const PluginDesignFurnitureListCatalogArgs = z.object({
232
- source: z.enum(["team", "general"]).optional(),
233
- category: z.string().optional(),
234
- })
235
- export type PluginDesignFurnitureListCatalogArgs = z.infer<
236
- typeof PluginDesignFurnitureListCatalogArgs
237
- >
238
-
239
- /**
240
- * Arguments for {@linkcode PluginDesignFurnitureApi.getCatalogItem} / {@linkcode PluginDesignFurnitureApi.exists}.
241
- *
242
- * | Property | Type | Description |
243
- * |---|---|---|
244
- * | `id` | `string` | The catalog library id |
245
- */
246
- export const PluginDesignFurnitureGetCatalogItemArgs = z.object({
247
- id: z.string(),
248
- })
249
- export type PluginDesignFurnitureGetCatalogItemArgs = z.infer<
250
- typeof PluginDesignFurnitureGetCatalogItemArgs
251
- >
252
-
253
- export const PluginDesignFurnitureExistsArgs = PluginDesignFurnitureGetCatalogItemArgs
254
- export type PluginDesignFurnitureExistsArgs = z.infer<typeof PluginDesignFurnitureExistsArgs>
255
-
256
- // ---------------------------------------------------------------------------
257
- // placed-furniture dimensions
258
- // ---------------------------------------------------------------------------
259
-
260
- /**
261
- * A placed furniture item's dimensions (engine units).
262
- *
263
- * | Property | Type | Description |
264
- * |---|---|---|
265
- * | `length` | `number` | Along the object (panel "Length") |
266
- * | `width` | `number` | Across the object (panel "Width") |
267
- * | `height` | `number` | Vertical (panel "Height") |
268
- */
269
- export const PluginFurnitureDimensions = z.object({
270
- length: z.number(),
271
- width: z.number(),
272
- height: z.number(),
273
- })
274
- export type PluginFurnitureDimensions = z.infer<typeof PluginFurnitureDimensions>
275
-
276
- /**
277
- * Arguments for {@linkcode PluginDesignFurnitureApi.getDimensions}.
278
- *
279
- * | Property | Type | Description |
280
- * |---|---|---|
281
- * | `item` | {@linkcode ComponentHandle} | The placed furniture to query |
282
- */
283
- export const PluginDesignFurnitureItemArgs = z.object({
284
- item: ComponentHandle,
285
- })
286
- export type PluginDesignFurnitureItemArgs = z.infer<typeof PluginDesignFurnitureItemArgs>
287
-
288
- /**
289
- * A partial dimension patch — each axis is optional; omitted axes are unchanged.
290
- * Every supplied axis must be a positive engine-unit length.
291
- *
292
- * | Property | Type | Description |
293
- * |---|---|---|
294
- * | `length` | `number`? | New length along the object (engine units, > 0) |
295
- * | `width` | `number`? | New width across the object (engine units, > 0) |
296
- * | `height` | `number`? | New height (engine units, > 0) |
297
- */
298
- export const PluginFurnitureDimensionUpdates = z.object({
299
- length: z.number().positive().optional(),
300
- width: z.number().positive().optional(),
301
- height: z.number().positive().optional(),
302
- })
303
- export type PluginFurnitureDimensionUpdates = z.infer<typeof PluginFurnitureDimensionUpdates>
304
-
305
- /**
306
- * Arguments for {@linkcode PluginDesignFurnitureApi.setDimensions}.
307
- *
308
- * | Property | Type | Description |
309
- * |---|---|---|
310
- * | `item` | {@linkcode ComponentHandle} | The placed furniture to resize |
311
- * | `dimensions` | {@linkcode PluginFurnitureDimensionUpdates} | The axes to change (each optional) |
312
- */
313
- export const PluginDesignFurnitureSetDimensionsArgs = z.object({
314
- item: ComponentHandle,
315
- dimensions: PluginFurnitureDimensionUpdates,
316
- })
317
- export type PluginDesignFurnitureSetDimensionsArgs = z.infer<
318
- typeof PluginDesignFurnitureSetDimensionsArgs
319
- >
1
+ import * as z from "zod"
2
+ import { PluginApiReturn } from "../../../types"
3
+ import { ComponentHandle } from "../../../handles"
4
+ import { PluginDesignChangeResult } from "../lock"
5
+ import { PluginObjectCatalogGroup } from "../doors"
6
+
7
+ /**
8
+ * `snaptrude.design.furniture` — the placeable furniture **catalog** (a library of
9
+ * source items, NOT scene entities) plus dimension reads/edits of PLACED furniture.
10
+ * Placement lives at `design.create.furniture` (returns a {@linkcode ComponentHandle});
11
+ * generic reads of placed furniture live at `design.query.listFurniture`/`getProperties`.
12
+ *
13
+ * Catalog items are plain value records ({@linkcode PluginFurnitureCatalogItem}) keyed
14
+ * by a library id (team `_id` or general `fullName`) — not handles. Reads are async
15
+ * (network-backed) but carry no `Async` suffix (§6.6).
16
+ *
17
+ * {@linkcode PluginDesignFurnitureApi.getDimensions} / {@linkcode PluginDesignFurnitureApi.setDimensions}
18
+ * target a PLACED furniture {@linkcode ComponentHandle} (not a catalog id) — `length`
19
+ * along the object, `width` across it, `height` up. Values are engine units, matching
20
+ * the length/width/height fields the furniture properties panel shows.
21
+ */
22
+ export abstract class PluginDesignFurnitureApi {
23
+ constructor() {}
24
+
25
+ /**
26
+ * Get the dimensions of a PLACED furniture item — `length` (along the object),
27
+ * `width` (across it) and `height` (vertical), in engine units. Mirrors the
28
+ * Length/Width/Height fields of the furniture properties panel.
29
+ *
30
+ * @param item The placed furniture to query
31
+ * @returns The dimensions, or `null` if the geometry is degenerate
32
+ *
33
+ * @examplePrompt How big is this sofa?
34
+ * @examplePrompt What are the dimensions of the selected furniture?
35
+ * @examplePrompt Measure the length, width and height of this table
36
+ * @examplePrompt Get the size of the chair I just placed
37
+ *
38
+ * # Example
39
+ * ```ts
40
+ * const [item] = await snaptrude.design.query.listFurniture({ isSelected: true })
41
+ * const dims = await snaptrude.design.furniture.getDimensions(item)
42
+ * if (dims) console.log(dims.length, dims.width, dims.height)
43
+ * ```
44
+ */
45
+ public abstract getDimensions(
46
+ item: ComponentHandle
47
+ ): PluginApiReturn<PluginFurnitureDimensions | null>
48
+
49
+ /**
50
+ * Resize a PLACED furniture item along one or more axes — `length`, `width`
51
+ * and/or `height` (engine units). Omitted axes are left unchanged. Each supplied
52
+ * axis is an undoable command, mirroring editing the furniture properties panel.
53
+ *
54
+ * @param item The placed furniture to resize
55
+ * @param dimensions New `length` / `width` / `height` (each optional, engine units)
56
+ * @returns The affected furniture
57
+ *
58
+ * @examplePrompt Make this table 1.8m long
59
+ * @examplePrompt Resize the selected sofa to 2000 wide
60
+ * @examplePrompt Set this furniture to 800mm tall
61
+ * @examplePrompt Change the desk to 1500 long and 700 deep
62
+ *
63
+ * # Example
64
+ * ```ts
65
+ * const [item] = await snaptrude.design.query.listFurniture({ isSelected: true })
66
+ * const { affected } = await snaptrude.design.furniture.setDimensions(item, {
67
+ * length: 1800,
68
+ * height: 750
69
+ * })
70
+ * ```
71
+ */
72
+ public abstract setDimensions(
73
+ item: ComponentHandle,
74
+ dimensions: PluginFurnitureDimensionUpdates
75
+ ): PluginApiReturn<PluginDesignChangeResult>
76
+
77
+ /**
78
+ * List the categories (Living, Bedroom, Kitchen, …) that organize the
79
+ * furniture catalog — the picker taxonomy, merged from built-in categories,
80
+ * team types, and backend user types. Pass a value to
81
+ * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `category` filter.
82
+ * @returns The category names (`[]` when empty)
83
+ *
84
+ * @examplePrompt What furniture categories are available?
85
+ * @examplePrompt List the furniture categories
86
+ * @examplePrompt Show me the furniture groups like living and bedroom
87
+ * @examplePrompt Which furniture categories can I filter by?
88
+ *
89
+ * # Example
90
+ * ```ts
91
+ * const categories = await snaptrude.design.furniture.listCategories()
92
+ * const [first] = categories
93
+ * const items = await snaptrude.design.furniture.listCatalog(undefined, first)
94
+ * console.log(first, "→", items.length, "items")
95
+ * ```
96
+ *
97
+ * @deprecated Use `design.furniture.listCatalogGroups` — the same name
98
+ * `design.doors` and `design.windows` use. Still supported.
99
+ */
100
+ public abstract listCategories(): PluginApiReturn<string[]>
101
+
102
+ /**
103
+ * List the furniture catalog's groups. Matches
104
+ * {@linkcode PluginDesignDoorsApi.listCatalogGroups} and
105
+ * {@linkcode PluginDesignWindowsApi.listCatalogGroups}, so all three catalog
106
+ * surfaces are named alike.
107
+ *
108
+ * `source` is `"default"` for the built-in picker groups and `"team"` for the
109
+ * sub-types of THIS project's team library — exactly the split
110
+ * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `source` filter uses, so
111
+ * every `"team"` group is guaranteed to match at least one team item here.
112
+ * For furniture the group token and its label are the same string (the
113
+ * category), so `dbType === label`; `design.doors`/`design.windows` have a
114
+ * distinct engine `dbType`.
115
+ *
116
+ * @returns The catalog groups as {@linkcode PluginObjectCatalogGroup}`[]`
117
+ * (`[]` when empty). Pass a group's `dbType` (=== `label`) to
118
+ * {@linkcode PluginDesignFurnitureApi.listCatalog}'s `category` filter to
119
+ * list its items.
120
+ *
121
+ * @examplePrompt What furniture groups are available?
122
+ * @examplePrompt List the furniture categories in this project
123
+ *
124
+ * # Example
125
+ * ```ts
126
+ * const groups = await snaptrude.design.furniture.listCatalogGroups()
127
+ * for (const g of groups) console.log(g.dbType, g.label, g.source)
128
+ * ```
129
+ */
130
+ public abstract listCatalogGroups(): PluginApiReturn<PluginObjectCatalogGroup[]>
131
+
132
+ /**
133
+ * List the placeable furniture catalog (team + general libraries),
134
+ * optionally filtered by library `source` and/or `category`.
135
+ * @param source Restrict to one library (optional)
136
+ * @param category Restrict to one category (optional; see {@linkcode PluginDesignFurnitureApi.listCategories})
137
+ * @returns The catalog as {@linkcode PluginFurnitureCatalogItem}`[]` (`[]` when empty)
138
+ *
139
+ * @examplePrompt What furniture can I place in this project?
140
+ * @examplePrompt Show me all the furniture available in the library
141
+ * @examplePrompt List the chairs and tables I can add to the model
142
+ * @examplePrompt Which furniture items are in my team's library?
143
+ * @examplePrompt Show me the bedroom furniture I can place
144
+ *
145
+ * # Example
146
+ * ```ts
147
+ * const bedroom = await snaptrude.design.furniture.listCatalog("team", "bedroom")
148
+ * for (const item of bedroom) console.log(item.id, item.name, item.thumbnailUrl)
149
+ * ```
150
+ */
151
+ public abstract listCatalog(
152
+ source?: "team" | "general",
153
+ category?: string
154
+ ): PluginApiReturn<PluginFurnitureCatalogItem[]>
155
+
156
+ /**
157
+ * Get a single catalog item by its library id.
158
+ * @param id The catalog library id
159
+ * @returns The item, or `null` if no catalog item matches
160
+ *
161
+ * @examplePrompt Get the details of this furniture item from the library
162
+ * @examplePrompt Look up the catalog entry for this chair id
163
+ * @examplePrompt What is the cost of this furniture item?
164
+ * @examplePrompt Show me the family name of the sofa in the catalog
165
+ *
166
+ * # Example
167
+ * ```ts
168
+ * const [entry] = await snaptrude.design.furniture.listCatalog()
169
+ * const item = await snaptrude.design.furniture.getCatalogItem(entry.id)
170
+ * if (item) console.log(item.name, item.source, item.familyName)
171
+ * ```
172
+ */
173
+ public abstract getCatalogItem(
174
+ id: string
175
+ ): PluginApiReturn<PluginFurnitureCatalogItem | null>
176
+
177
+ /**
178
+ * Test whether a catalog item exists for the given library id.
179
+ * @param id The catalog library id
180
+ * @returns `true` if it exists, otherwise `false`
181
+ *
182
+ * @examplePrompt Is this furniture item still in the library?
183
+ * @examplePrompt Check whether a catalog item with this id exists
184
+ * @examplePrompt Does my team library have this chair?
185
+ * @examplePrompt Verify the sofa is available in the catalog before placing it
186
+ *
187
+ * # Example
188
+ * ```ts
189
+ * const [entry] = await snaptrude.design.furniture.listCatalog()
190
+ * const stillAvailable = await snaptrude.design.furniture.exists(entry.id)
191
+ * console.log(stillAvailable ? "safe to place" : "removed from library")
192
+ * ```
193
+ */
194
+ public abstract exists(id: string): PluginApiReturn<boolean>
195
+ }
196
+
197
+ /**
198
+ * A placeable furniture catalog item (value record — not a scene entity/handle).
199
+ *
200
+ * | Property | Type | Description |
201
+ * |---|---|---|
202
+ * | `id` | `string` | Library id (team `_id` or general `fullName`) — pass to `design.create.furniture` |
203
+ * | `name` | `string` | Display name |
204
+ * | `source` | `'team' \| 'general'` | Which library it came from |
205
+ * | `subType` | `string` | Sub-type (optional) |
206
+ * | `category` | `string` | Category the item belongs to (optional) |
207
+ * | `thumbnailUrl` | `string` | Preview thumbnail URL (optional; never the mesh URL) |
208
+ * | `cost` | `number` | Cost (optional; team items) |
209
+ * | `familyName` | `string` | Family name (optional) |
210
+ */
211
+ export const PluginFurnitureCatalogItem = z.object({
212
+ id: z.string(),
213
+ name: z.string(),
214
+ source: z.enum(["team", "general"]),
215
+ subType: z.string().optional(),
216
+ category: z.string().optional(),
217
+ thumbnailUrl: z.string().optional(),
218
+ cost: z.number().optional(),
219
+ familyName: z.string().optional(),
220
+ })
221
+ export type PluginFurnitureCatalogItem = z.infer<typeof PluginFurnitureCatalogItem>
222
+
223
+ /**
224
+ * Arguments for {@linkcode PluginDesignFurnitureApi.listCatalog}.
225
+ *
226
+ * | Property | Type | Description |
227
+ * |---|---|---|
228
+ * | `source` | `'team' \| 'general'` | Restrict to one library (optional) |
229
+ * | `category` | `string` | Restrict to one category (optional) |
230
+ */
231
+ export const PluginDesignFurnitureListCatalogArgs = z.object({
232
+ source: z.enum(["team", "general"]).optional(),
233
+ category: z.string().optional(),
234
+ })
235
+ export type PluginDesignFurnitureListCatalogArgs = z.infer<
236
+ typeof PluginDesignFurnitureListCatalogArgs
237
+ >
238
+
239
+ /**
240
+ * Arguments for {@linkcode PluginDesignFurnitureApi.getCatalogItem} / {@linkcode PluginDesignFurnitureApi.exists}.
241
+ *
242
+ * | Property | Type | Description |
243
+ * |---|---|---|
244
+ * | `id` | `string` | The catalog library id |
245
+ */
246
+ export const PluginDesignFurnitureGetCatalogItemArgs = z.object({
247
+ id: z.string(),
248
+ })
249
+ export type PluginDesignFurnitureGetCatalogItemArgs = z.infer<
250
+ typeof PluginDesignFurnitureGetCatalogItemArgs
251
+ >
252
+
253
+ export const PluginDesignFurnitureExistsArgs = PluginDesignFurnitureGetCatalogItemArgs
254
+ export type PluginDesignFurnitureExistsArgs = z.infer<typeof PluginDesignFurnitureExistsArgs>
255
+
256
+ // ---------------------------------------------------------------------------
257
+ // placed-furniture dimensions
258
+ // ---------------------------------------------------------------------------
259
+
260
+ /**
261
+ * A placed furniture item's dimensions (engine units).
262
+ *
263
+ * | Property | Type | Description |
264
+ * |---|---|---|
265
+ * | `length` | `number` | Along the object (panel "Length") |
266
+ * | `width` | `number` | Across the object (panel "Width") |
267
+ * | `height` | `number` | Vertical (panel "Height") |
268
+ */
269
+ export const PluginFurnitureDimensions = z.object({
270
+ length: z.number(),
271
+ width: z.number(),
272
+ height: z.number(),
273
+ })
274
+ export type PluginFurnitureDimensions = z.infer<typeof PluginFurnitureDimensions>
275
+
276
+ /**
277
+ * Arguments for {@linkcode PluginDesignFurnitureApi.getDimensions}.
278
+ *
279
+ * | Property | Type | Description |
280
+ * |---|---|---|
281
+ * | `item` | {@linkcode ComponentHandle} | The placed furniture to query |
282
+ */
283
+ export const PluginDesignFurnitureItemArgs = z.object({
284
+ item: ComponentHandle,
285
+ })
286
+ export type PluginDesignFurnitureItemArgs = z.infer<typeof PluginDesignFurnitureItemArgs>
287
+
288
+ /**
289
+ * A partial dimension patch — each axis is optional; omitted axes are unchanged.
290
+ * Every supplied axis must be a positive engine-unit length.
291
+ *
292
+ * | Property | Type | Description |
293
+ * |---|---|---|
294
+ * | `length` | `number`? | New length along the object (engine units, > 0) |
295
+ * | `width` | `number`? | New width across the object (engine units, > 0) |
296
+ * | `height` | `number`? | New height (engine units, > 0) |
297
+ */
298
+ export const PluginFurnitureDimensionUpdates = z.object({
299
+ length: z.number().positive().optional(),
300
+ width: z.number().positive().optional(),
301
+ height: z.number().positive().optional(),
302
+ })
303
+ export type PluginFurnitureDimensionUpdates = z.infer<typeof PluginFurnitureDimensionUpdates>
304
+
305
+ /**
306
+ * Arguments for {@linkcode PluginDesignFurnitureApi.setDimensions}.
307
+ *
308
+ * | Property | Type | Description |
309
+ * |---|---|---|
310
+ * | `item` | {@linkcode ComponentHandle} | The placed furniture to resize |
311
+ * | `dimensions` | {@linkcode PluginFurnitureDimensionUpdates} | The axes to change (each optional) |
312
+ */
313
+ export const PluginDesignFurnitureSetDimensionsArgs = z.object({
314
+ item: ComponentHandle,
315
+ dimensions: PluginFurnitureDimensionUpdates,
316
+ })
317
+ export type PluginDesignFurnitureSetDimensionsArgs = z.infer<
318
+ typeof PluginDesignFurnitureSetDimensionsArgs
319
+ >