@snaptrude/plugin-core 0.0.0-bimsvg-20260928124803

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 (383) hide show
  1. package/AGENTS.md +231 -0
  2. package/CHANGELOG.md +341 -0
  3. package/CLAUDE.md +11 -0
  4. package/api-manifest.json +9120 -0
  5. package/dist/api/analysis/daylight.d.ts +603 -0
  6. package/dist/api/analysis/daylight.d.ts.map +1 -0
  7. package/dist/api/analysis/heatmaps.d.ts +658 -0
  8. package/dist/api/analysis/heatmaps.d.ts.map +1 -0
  9. package/dist/api/analysis/illuminance.d.ts +145 -0
  10. package/dist/api/analysis/illuminance.d.ts.map +1 -0
  11. package/dist/api/analysis/index.d.ts +59 -0
  12. package/dist/api/analysis/index.d.ts.map +1 -0
  13. package/dist/api/analysis/shadows.d.ts +165 -0
  14. package/dist/api/analysis/shadows.d.ts.map +1 -0
  15. package/dist/api/analysis/solar.d.ts +249 -0
  16. package/dist/api/analysis/solar.d.ts.map +1 -0
  17. package/dist/api/analysis/sunlightHours.d.ts +208 -0
  18. package/dist/api/analysis/sunlightHours.d.ts.map +1 -0
  19. package/dist/api/analysis/sunpath.d.ts +80 -0
  20. package/dist/api/analysis/sunpath.d.ts.map +1 -0
  21. package/dist/api/analysis/weather.d.ts +193 -0
  22. package/dist/api/analysis/weather.d.ts.map +1 -0
  23. package/dist/api/core/buildings.d.ts +427 -0
  24. package/dist/api/core/buildings.d.ts.map +1 -0
  25. package/dist/api/core/camera/index.d.ts +261 -0
  26. package/dist/api/core/camera/index.d.ts.map +1 -0
  27. package/dist/api/core/comment/index.d.ts +333 -0
  28. package/dist/api/core/comment/index.d.ts.map +1 -0
  29. package/dist/api/core/geom/create/index.d.ts +1073 -0
  30. package/dist/api/core/geom/create/index.d.ts.map +1 -0
  31. package/dist/api/core/geom/delete/index.d.ts +78 -0
  32. package/dist/api/core/geom/delete/index.d.ts.map +1 -0
  33. package/dist/api/core/geom/index.d.ts +33 -0
  34. package/dist/api/core/geom/index.d.ts.map +1 -0
  35. package/dist/api/core/geom/query/arc.d.ts +169 -0
  36. package/dist/api/core/geom/query/arc.d.ts.map +1 -0
  37. package/dist/api/core/geom/query/brep.d.ts +514 -0
  38. package/dist/api/core/geom/query/brep.d.ts.map +1 -0
  39. package/dist/api/core/geom/query/circle.d.ts +378 -0
  40. package/dist/api/core/geom/query/circle.d.ts.map +1 -0
  41. package/dist/api/core/geom/query/contour.d.ts +450 -0
  42. package/dist/api/core/geom/query/contour.d.ts.map +1 -0
  43. package/dist/api/core/geom/query/curve.d.ts +918 -0
  44. package/dist/api/core/geom/query/curve.d.ts.map +1 -0
  45. package/dist/api/core/geom/query/edge.d.ts +128 -0
  46. package/dist/api/core/geom/query/edge.d.ts.map +1 -0
  47. package/dist/api/core/geom/query/face.d.ts +363 -0
  48. package/dist/api/core/geom/query/face.d.ts.map +1 -0
  49. package/dist/api/core/geom/query/halfedge.d.ts +206 -0
  50. package/dist/api/core/geom/query/halfedge.d.ts.map +1 -0
  51. package/dist/api/core/geom/query/index.d.ts +61 -0
  52. package/dist/api/core/geom/query/index.d.ts.map +1 -0
  53. package/dist/api/core/geom/query/profile.d.ts +410 -0
  54. package/dist/api/core/geom/query/profile.d.ts.map +1 -0
  55. package/dist/api/core/geom/query/vertex.d.ts +187 -0
  56. package/dist/api/core/geom/query/vertex.d.ts.map +1 -0
  57. package/dist/api/core/geom/update/contour.d.ts +272 -0
  58. package/dist/api/core/geom/update/contour.d.ts.map +1 -0
  59. package/dist/api/core/geom/update/curve.d.ts +180 -0
  60. package/dist/api/core/geom/update/curve.d.ts.map +1 -0
  61. package/dist/api/core/geom/update/index.d.ts +27 -0
  62. package/dist/api/core/geom/update/index.d.ts.map +1 -0
  63. package/dist/api/core/geom/update/profile.d.ts +329 -0
  64. package/dist/api/core/geom/update/profile.d.ts.map +1 -0
  65. package/dist/api/core/groups.d.ts +485 -0
  66. package/dist/api/core/groups.d.ts.map +1 -0
  67. package/dist/api/core/handles/index.d.ts +210 -0
  68. package/dist/api/core/handles/index.d.ts.map +1 -0
  69. package/dist/api/core/history/index.d.ts +78 -0
  70. package/dist/api/core/history/index.d.ts.map +1 -0
  71. package/dist/api/core/index.d.ts +97 -0
  72. package/dist/api/core/index.d.ts.map +1 -0
  73. package/dist/api/core/io/export/index.d.ts +134 -0
  74. package/dist/api/core/io/export/index.d.ts.map +1 -0
  75. package/dist/api/core/io/import/index.d.ts +455 -0
  76. package/dist/api/core/io/import/index.d.ts.map +1 -0
  77. package/dist/api/core/io/index.d.ts +40 -0
  78. package/dist/api/core/io/index.d.ts.map +1 -0
  79. package/dist/api/core/io/job/index.d.ts +139 -0
  80. package/dist/api/core/io/job/index.d.ts.map +1 -0
  81. package/dist/api/core/io/query/index.d.ts +74 -0
  82. package/dist/api/core/io/query/index.d.ts.map +1 -0
  83. package/dist/api/core/io/terrain/index.d.ts +341 -0
  84. package/dist/api/core/io/terrain/index.d.ts.map +1 -0
  85. package/dist/api/core/io/underlay/index.d.ts +805 -0
  86. package/dist/api/core/io/underlay/index.d.ts.map +1 -0
  87. package/dist/api/core/layers.d.ts +402 -0
  88. package/dist/api/core/layers.d.ts.map +1 -0
  89. package/dist/api/core/math/index.d.ts +18 -0
  90. package/dist/api/core/math/index.d.ts.map +1 -0
  91. package/dist/api/core/math/quat.d.ts +170 -0
  92. package/dist/api/core/math/quat.d.ts.map +1 -0
  93. package/dist/api/core/math/vec3.d.ts +174 -0
  94. package/dist/api/core/math/vec3.d.ts.map +1 -0
  95. package/dist/api/core/mode/index.d.ts +111 -0
  96. package/dist/api/core/mode/index.d.ts.map +1 -0
  97. package/dist/api/core/project/index.d.ts +466 -0
  98. package/dist/api/core/project/index.d.ts.map +1 -0
  99. package/dist/api/core/proposals/index.d.ts +531 -0
  100. package/dist/api/core/proposals/index.d.ts.map +1 -0
  101. package/dist/api/core/storeys/index.d.ts +265 -0
  102. package/dist/api/core/storeys/index.d.ts.map +1 -0
  103. package/dist/api/core/tags.d.ts +860 -0
  104. package/dist/api/core/tags.d.ts.map +1 -0
  105. package/dist/api/core/units/index.d.ts +175 -0
  106. package/dist/api/core/units/index.d.ts.map +1 -0
  107. package/dist/api/core/user.d.ts +44 -0
  108. package/dist/api/core/user.d.ts.map +1 -0
  109. package/dist/api/core/zoom/index.d.ts +49 -0
  110. package/dist/api/core/zoom/index.d.ts.map +1 -0
  111. package/dist/api/design/boolean/index.d.ts +168 -0
  112. package/dist/api/design/boolean/index.d.ts.map +1 -0
  113. package/dist/api/design/create/bulk-items.d.ts +185 -0
  114. package/dist/api/design/create/bulk-items.d.ts.map +1 -0
  115. package/dist/api/design/create/grids.d.ts +132 -0
  116. package/dist/api/design/create/grids.d.ts.map +1 -0
  117. package/dist/api/design/create/index.d.ts +1747 -0
  118. package/dist/api/design/create/index.d.ts.map +1 -0
  119. package/dist/api/design/create/opening-fields.d.ts +37 -0
  120. package/dist/api/design/create/opening-fields.d.ts.map +1 -0
  121. package/dist/api/design/delete/index.d.ts +70 -0
  122. package/dist/api/design/delete/index.d.ts.map +1 -0
  123. package/dist/api/design/dimensions.d.ts +427 -0
  124. package/dist/api/design/dimensions.d.ts.map +1 -0
  125. package/dist/api/design/doors/index.d.ts +470 -0
  126. package/dist/api/design/doors/index.d.ts.map +1 -0
  127. package/dist/api/design/edit/index.d.ts +49 -0
  128. package/dist/api/design/edit/index.d.ts.map +1 -0
  129. package/dist/api/design/erase/index.d.ts +160 -0
  130. package/dist/api/design/erase/index.d.ts.map +1 -0
  131. package/dist/api/design/family.d.ts +611 -0
  132. package/dist/api/design/family.d.ts.map +1 -0
  133. package/dist/api/design/furniture/index.d.ts +296 -0
  134. package/dist/api/design/furniture/index.d.ts.map +1 -0
  135. package/dist/api/design/grids.d.ts +237 -0
  136. package/dist/api/design/grids.d.ts.map +1 -0
  137. package/dist/api/design/index.d.ts +260 -0
  138. package/dist/api/design/index.d.ts.map +1 -0
  139. package/dist/api/design/lock.d.ts +67 -0
  140. package/dist/api/design/lock.d.ts.map +1 -0
  141. package/dist/api/design/materials/index.d.ts +551 -0
  142. package/dist/api/design/materials/index.d.ts.map +1 -0
  143. package/dist/api/design/query/geometry/index.d.ts +252 -0
  144. package/dist/api/design/query/geometry/index.d.ts.map +1 -0
  145. package/dist/api/design/query/grids.d.ts +287 -0
  146. package/dist/api/design/query/grids.d.ts.map +1 -0
  147. package/dist/api/design/query/index.d.ts +1318 -0
  148. package/dist/api/design/query/index.d.ts.map +1 -0
  149. package/dist/api/design/query/referenceLines.d.ts +45 -0
  150. package/dist/api/design/query/referenceLines.d.ts.map +1 -0
  151. package/dist/api/design/query/spaces.d.ts +394 -0
  152. package/dist/api/design/query/spaces.d.ts.map +1 -0
  153. package/dist/api/design/selection/index.d.ts +282 -0
  154. package/dist/api/design/selection/index.d.ts.map +1 -0
  155. package/dist/api/design/shared.d.ts +38 -0
  156. package/dist/api/design/shared.d.ts.map +1 -0
  157. package/dist/api/design/transform/index.d.ts +249 -0
  158. package/dist/api/design/transform/index.d.ts.map +1 -0
  159. package/dist/api/design/types/index.d.ts +181 -0
  160. package/dist/api/design/types/index.d.ts.map +1 -0
  161. package/dist/api/design/update/index.d.ts +803 -0
  162. package/dist/api/design/update/index.d.ts.map +1 -0
  163. package/dist/api/design/visibility.d.ts +126 -0
  164. package/dist/api/design/visibility.d.ts.map +1 -0
  165. package/dist/api/design/windows/index.d.ts +300 -0
  166. package/dist/api/design/windows/index.d.ts.map +1 -0
  167. package/dist/api/entity/buildableEnvelope.d.ts +265 -0
  168. package/dist/api/entity/buildableEnvelope.d.ts.map +1 -0
  169. package/dist/api/entity/department.d.ts +1 -0
  170. package/dist/api/entity/department.d.ts.map +1 -0
  171. package/dist/api/entity/index.d.ts +28 -0
  172. package/dist/api/entity/index.d.ts.map +1 -0
  173. package/dist/api/entity/referenceLine.d.ts +210 -0
  174. package/dist/api/entity/referenceLine.d.ts.map +1 -0
  175. package/dist/api/entity/space.d.ts +846 -0
  176. package/dist/api/entity/space.d.ts.map +1 -0
  177. package/dist/api/entity/story.d.ts +476 -0
  178. package/dist/api/entity/story.d.ts.map +1 -0
  179. package/dist/api/index.d.ts +45 -0
  180. package/dist/api/index.d.ts.map +1 -0
  181. package/dist/api/presentation/aiInspiration.d.ts +2400 -0
  182. package/dist/api/presentation/aiInspiration.d.ts.map +1 -0
  183. package/dist/api/presentation/annotate.d.ts +483 -0
  184. package/dist/api/presentation/annotate.d.ts.map +1 -0
  185. package/dist/api/presentation/diagrams.d.ts +184 -0
  186. package/dist/api/presentation/diagrams.d.ts.map +1 -0
  187. package/dist/api/presentation/drawings.d.ts +2900 -0
  188. package/dist/api/presentation/drawings.d.ts.map +1 -0
  189. package/dist/api/presentation/export.d.ts +126 -0
  190. package/dist/api/presentation/export.d.ts.map +1 -0
  191. package/dist/api/presentation/import.d.ts +164 -0
  192. package/dist/api/presentation/import.d.ts.map +1 -0
  193. package/dist/api/presentation/index.d.ts +114 -0
  194. package/dist/api/presentation/index.d.ts.map +1 -0
  195. package/dist/api/presentation/placedViews.d.ts +1232 -0
  196. package/dist/api/presentation/placedViews.d.ts.map +1 -0
  197. package/dist/api/presentation/shapes.d.ts +481 -0
  198. package/dist/api/presentation/shapes.d.ts.map +1 -0
  199. package/dist/api/presentation/sheets.d.ts +643 -0
  200. package/dist/api/presentation/sheets.d.ts.map +1 -0
  201. package/dist/api/presentation/slideshow.d.ts +125 -0
  202. package/dist/api/presentation/slideshow.d.ts.map +1 -0
  203. package/dist/api/presentation/tables.d.ts +81 -0
  204. package/dist/api/presentation/tables.d.ts.map +1 -0
  205. package/dist/api/presentation/viewPresets.d.ts +70 -0
  206. package/dist/api/presentation/viewPresets.d.ts.map +1 -0
  207. package/dist/api/presentation/views.d.ts +741 -0
  208. package/dist/api/presentation/views.d.ts.map +1 -0
  209. package/dist/api/program/adjacency.d.ts +155 -0
  210. package/dist/api/program/adjacency.d.ts.map +1 -0
  211. package/dist/api/program/areas.d.ts +450 -0
  212. package/dist/api/program/areas.d.ts.map +1 -0
  213. package/dist/api/program/classification.d.ts +135 -0
  214. package/dist/api/program/classification.d.ts.map +1 -0
  215. package/dist/api/program/cores.d.ts +78 -0
  216. package/dist/api/program/cores.d.ts.map +1 -0
  217. package/dist/api/program/departments.d.ts +487 -0
  218. package/dist/api/program/departments.d.ts.map +1 -0
  219. package/dist/api/program/index.d.ts +71 -0
  220. package/dist/api/program/index.d.ts.map +1 -0
  221. package/dist/api/program/labels.d.ts +355 -0
  222. package/dist/api/program/labels.d.ts.map +1 -0
  223. package/dist/api/program/layout.d.ts +398 -0
  224. package/dist/api/program/layout.d.ts.map +1 -0
  225. package/dist/api/program/metadata.d.ts +328 -0
  226. package/dist/api/program/metadata.d.ts.map +1 -0
  227. package/dist/api/program/metrics.d.ts +108 -0
  228. package/dist/api/program/metrics.d.ts.map +1 -0
  229. package/dist/api/program/site.d.ts +823 -0
  230. package/dist/api/program/site.d.ts.map +1 -0
  231. package/dist/api/program/spreadsheet.d.ts +2628 -0
  232. package/dist/api/program/spreadsheet.d.ts.map +1 -0
  233. package/dist/api/workspace/index.d.ts +552 -0
  234. package/dist/api/workspace/index.d.ts.map +1 -0
  235. package/dist/errors/codes.d.ts +34 -0
  236. package/dist/errors/codes.d.ts.map +1 -0
  237. package/dist/errors/envelope.d.ts +56 -0
  238. package/dist/errors/envelope.d.ts.map +1 -0
  239. package/dist/errors/index.d.ts +6 -0
  240. package/dist/errors/index.d.ts.map +1 -0
  241. package/dist/errors/plugin-error.d.ts +69 -0
  242. package/dist/errors/plugin-error.d.ts.map +1 -0
  243. package/dist/handles.d.ts +229 -0
  244. package/dist/handles.d.ts.map +1 -0
  245. package/dist/host-utils.d.ts +47 -0
  246. package/dist/host-utils.d.ts.map +1 -0
  247. package/dist/index.cjs +8836 -0
  248. package/dist/index.cjs.map +1 -0
  249. package/dist/index.d.ts +6 -0
  250. package/dist/index.d.ts.map +1 -0
  251. package/dist/index.js +7568 -0
  252. package/dist/index.js.map +1 -0
  253. package/dist/types.d.ts +16 -0
  254. package/dist/types.d.ts.map +1 -0
  255. package/package.json +41 -0
  256. package/scripts/generate-manifest.mjs +238 -0
  257. package/scripts/generate-manifest.test.mjs +292 -0
  258. package/src/api/analysis/daylight.ts +470 -0
  259. package/src/api/analysis/heatmaps.ts +683 -0
  260. package/src/api/analysis/illuminance.ts +155 -0
  261. package/src/api/analysis/index.ts +61 -0
  262. package/src/api/analysis/shadows.ts +183 -0
  263. package/src/api/analysis/solar.ts +237 -0
  264. package/src/api/analysis/sunlightHours.ts +211 -0
  265. package/src/api/analysis/sunpath.ts +83 -0
  266. package/src/api/analysis/weather.ts +179 -0
  267. package/src/api/core/buildings.ts +485 -0
  268. package/src/api/core/camera/index.ts +268 -0
  269. package/src/api/core/comment/index.ts +376 -0
  270. package/src/api/core/geom/create/index.ts +1204 -0
  271. package/src/api/core/geom/delete/index.ts +84 -0
  272. package/src/api/core/geom/index.ts +35 -0
  273. package/src/api/core/geom/query/arc.ts +169 -0
  274. package/src/api/core/geom/query/brep.ts +563 -0
  275. package/src/api/core/geom/query/circle.ts +404 -0
  276. package/src/api/core/geom/query/contour.ts +540 -0
  277. package/src/api/core/geom/query/curve.ts +1078 -0
  278. package/src/api/core/geom/query/edge.ts +130 -0
  279. package/src/api/core/geom/query/face.ts +403 -0
  280. package/src/api/core/geom/query/halfedge.ts +210 -0
  281. package/src/api/core/geom/query/index.ts +63 -0
  282. package/src/api/core/geom/query/profile.ts +473 -0
  283. package/src/api/core/geom/query/vertex.ts +205 -0
  284. package/src/api/core/geom/update/contour.ts +315 -0
  285. package/src/api/core/geom/update/curve.ts +209 -0
  286. package/src/api/core/geom/update/index.ts +29 -0
  287. package/src/api/core/geom/update/profile.ts +377 -0
  288. package/src/api/core/groups.ts +521 -0
  289. package/src/api/core/handles/index.ts +233 -0
  290. package/src/api/core/history/index.ts +84 -0
  291. package/src/api/core/index.ts +99 -0
  292. package/src/api/core/io/export/index.ts +126 -0
  293. package/src/api/core/io/import/index.ts +504 -0
  294. package/src/api/core/io/index.ts +42 -0
  295. package/src/api/core/io/job/index.ts +140 -0
  296. package/src/api/core/io/query/index.ts +71 -0
  297. package/src/api/core/io/terrain/index.ts +360 -0
  298. package/src/api/core/io/underlay/index.ts +705 -0
  299. package/src/api/core/layers.ts +333 -0
  300. package/src/api/core/math/index.ts +20 -0
  301. package/src/api/core/math/quat.ts +172 -0
  302. package/src/api/core/math/vec3.ts +179 -0
  303. package/src/api/core/mode/index.ts +108 -0
  304. package/src/api/core/project/index.ts +479 -0
  305. package/src/api/core/proposals/index.ts +569 -0
  306. package/src/api/core/storeys/index.ts +294 -0
  307. package/src/api/core/tags.ts +911 -0
  308. package/src/api/core/units/index.ts +164 -0
  309. package/src/api/core/user.ts +46 -0
  310. package/src/api/core/zoom/index.ts +51 -0
  311. package/src/api/design/boolean/index.ts +179 -0
  312. package/src/api/design/create/bulk-items.ts +186 -0
  313. package/src/api/design/create/grids.ts +137 -0
  314. package/src/api/design/create/index.ts +1954 -0
  315. package/src/api/design/create/opening-fields.ts +37 -0
  316. package/src/api/design/delete/index.ts +74 -0
  317. package/src/api/design/dimensions.ts +453 -0
  318. package/src/api/design/doors/index.ts +500 -0
  319. package/src/api/design/edit/index.ts +54 -0
  320. package/src/api/design/erase/index.ts +151 -0
  321. package/src/api/design/family.ts +646 -0
  322. package/src/api/design/furniture/index.ts +319 -0
  323. package/src/api/design/grids.ts +237 -0
  324. package/src/api/design/index.ts +274 -0
  325. package/src/api/design/lock.ts +69 -0
  326. package/src/api/design/materials/index.ts +608 -0
  327. package/src/api/design/query/geometry/index.ts +288 -0
  328. package/src/api/design/query/grids.ts +197 -0
  329. package/src/api/design/query/index.ts +1176 -0
  330. package/src/api/design/query/referenceLines.ts +52 -0
  331. package/src/api/design/query/spaces.ts +275 -0
  332. package/src/api/design/selection/index.ts +273 -0
  333. package/src/api/design/shared.ts +40 -0
  334. package/src/api/design/transform/index.ts +254 -0
  335. package/src/api/design/types/index.ts +156 -0
  336. package/src/api/design/update/index.ts +798 -0
  337. package/src/api/design/visibility.ts +143 -0
  338. package/src/api/design/windows/index.ts +333 -0
  339. package/src/api/entity/buildableEnvelope.ts +322 -0
  340. package/src/api/entity/department.ts +0 -0
  341. package/src/api/entity/index.ts +30 -0
  342. package/src/api/entity/referenceLine.ts +235 -0
  343. package/src/api/entity/space.ts +612 -0
  344. package/src/api/entity/story.ts +517 -0
  345. package/src/api/index.ts +47 -0
  346. package/src/api/presentation/aiInspiration.ts +1116 -0
  347. package/src/api/presentation/annotate.ts +417 -0
  348. package/src/api/presentation/diagrams.ts +194 -0
  349. package/src/api/presentation/drawings.ts +529 -0
  350. package/src/api/presentation/export.ts +133 -0
  351. package/src/api/presentation/import.ts +159 -0
  352. package/src/api/presentation/index.ts +129 -0
  353. package/src/api/presentation/placedViews.ts +1203 -0
  354. package/src/api/presentation/shapes.ts +274 -0
  355. package/src/api/presentation/sheets.ts +616 -0
  356. package/src/api/presentation/slideshow.ts +134 -0
  357. package/src/api/presentation/tables.ts +84 -0
  358. package/src/api/presentation/viewPresets.ts +83 -0
  359. package/src/api/presentation/views.ts +698 -0
  360. package/src/api/program/adjacency.ts +164 -0
  361. package/src/api/program/areas.ts +408 -0
  362. package/src/api/program/classification.ts +138 -0
  363. package/src/api/program/cores.ts +83 -0
  364. package/src/api/program/departments.ts +517 -0
  365. package/src/api/program/index.ts +73 -0
  366. package/src/api/program/labels.ts +332 -0
  367. package/src/api/program/layout.ts +422 -0
  368. package/src/api/program/metadata.ts +364 -0
  369. package/src/api/program/metrics.ts +120 -0
  370. package/src/api/program/site.ts +748 -0
  371. package/src/api/program/spreadsheet.ts +2698 -0
  372. package/src/api/workspace/index.ts +612 -0
  373. package/src/errors/codes.ts +136 -0
  374. package/src/errors/envelope.ts +75 -0
  375. package/src/errors/index.ts +21 -0
  376. package/src/errors/plugin-error.ts +134 -0
  377. package/src/handles.ts +282 -0
  378. package/src/host-utils.ts +68 -0
  379. package/src/index.ts +5 -0
  380. package/src/types.ts +16 -0
  381. package/test/errors.test.mjs +184 -0
  382. package/tsconfig.json +22 -0
  383. package/tsup.config.ts +12 -0
@@ -0,0 +1,1747 @@
1
+ import * as z from "zod";
2
+ import { PluginApiReturn } from "../../../types";
3
+ import { BrepHandle, ComponentHandle, ContourHandle, CurveHandle, ProfileHandle, Vec3Handle } from "../../../handles";
4
+ import { PluginGridStyleOptions } from "./grids";
5
+ import { PluginSpaceType, PluginMassType, PluginDepartmentId } from "../../entity/space";
6
+ import { PluginBuildableEnvelopePolygonVertex, PluginBuildableEnvelopeSetbackTier, PluginBuildableEnvelopeVerticalCap, PluginBuildableEnvelopeCreateResult } from "../../entity/buildableEnvelope";
7
+ import type { PluginCreateDoorItem, PluginCreateFloorItem, PluginCreateFurnitureItem, PluginCreateWallRunItem, PluginCreateWindowItem } from "./bulk-items";
8
+ /**
9
+ * `design.create.*` — author new scene-committed BIM entities.
10
+ *
11
+ * Every creator takes geometry handles + scalars and returns a
12
+ * {@linkcode ComponentHandle} (or `ComponentHandle[]` for plural creators;
13
+ * `wallRuns` returns one `ComponentHandle[]` per run) — the
14
+ * `Component.id` of the created entity, resolvable across the rest of the
15
+ * `design.*` surface. Creation is an undoable host call; it **throws** on failure
16
+ * (no `Result` wrapper — consistent with `core.geom.create.*`).
17
+ *
18
+ * Footprint objects take a {@linkcode ContourHandle} (outer profile + holes);
19
+ * build one with `snaptrude.core.geom.create.contourFromProfile(s)`.
20
+ *
21
+ * `door`/`window` place a catalog item into a host wall (the world point is
22
+ * projected onto the wall face to locate the opening; the wall is re-cut in one
23
+ * undo entry) and throw if the point projects outside the wall. `smartLayout` is
24
+ * the one creator returning a grouped {@linkcode PluginSmartLayoutResult} rather
25
+ * than a handle — it clones an in-scene template into one or more target spaces,
26
+ * merging every target into a single undo batch (see its JSDoc).
27
+ *
28
+ * Accessed via `snaptrude.design.create`.
29
+ */
30
+ export declare abstract class PluginDesignCreateApi {
31
+ constructor();
32
+ /**
33
+ * Create a **space** (a room / mass) by extruding a footprint contour upward.
34
+ *
35
+ * The `contour` is the bottom footprint (outer profile + optional holes); it
36
+ * is extruded by `height` along +Y. The space is placed on the active story
37
+ * and assigned a default department unless overridden.
38
+ *
39
+ * @param contour - Bottom footprint (outer + holes)
40
+ * @param height - Extrusion height (Snaptrude units, > 0)
41
+ * @param label - Room label (maps to the space's `room_type`)
42
+ * @param position - Offset from origin (default origin)
43
+ * @param spaceType - Space-type classification (default `Room`)
44
+ * @param massType - Mass-type classification (default `Room`)
45
+ * @param departmentId - Department assignment (default department)
46
+ * @param storey - Target storey number to place the space on — the same integer
47
+ * `entity.story` uses (`1` ground, `2` first floor, `-1` basement). Default:
48
+ * the active storey. Folds a `core.storeys.setActive` call into the create,
49
+ * placing the space at that storey's floor elevation (any `position` offset is
50
+ * applied on top). Throws if no storey has that value.
51
+ * @returns the {@linkcode ComponentHandle} of the created space
52
+ * @throws if the contour is invalid, the height is not positive, or the target
53
+ * storey does not exist
54
+ *
55
+ * @examplePrompt Create a room called Living Room that's 3m tall from this outline
56
+ * @examplePrompt Add a new space on the current storey using this footprint
57
+ * @examplePrompt Make a bedroom here and assign it to the Residential department
58
+ * @examplePrompt Extrude this closed outline into a 10 foot high room
59
+ * @examplePrompt Can you create a Kitchen space from the sketch I just drew?
60
+ * @examplePrompt Create a bedroom on the second floor from this outline
61
+ *
62
+ * @performance For MORE THAN ONE space, call `design.create.spaces(items[])` — the whole
63
+ * batch is one host round-trip. Looping this single-space creator is N round-trips (slow,
64
+ * and a large loop can trip the plugin rate limit).
65
+ *
66
+ * # Example
67
+ * ```ts
68
+ * const v = snaptrude.core.math.vec3
69
+ * const outer = await snaptrude.core.geom.create.profileFromLinePoints([
70
+ * await v.new(0, 0, 0),
71
+ * await v.new(10, 0, 0),
72
+ * await v.new(10, 0, 8),
73
+ * await v.new(0, 0, 8),
74
+ * ])
75
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(outer)
76
+ * const space = await snaptrude.design.create.space(contour, 3, "Living")
77
+ * // …place one directly on the second floor (no setActive dance):
78
+ * const upstairs = await snaptrude.design.create.space(
79
+ * contour, 3, "Bedroom", undefined, undefined, undefined, undefined, 2,
80
+ * )
81
+ * ```
82
+ */
83
+ abstract space(contour: ContourHandle, height: number, label?: string, position?: Vec3Handle, spaceType?: PluginSpaceType, massType?: PluginMassType, departmentId?: PluginDepartmentId, storey?: number): PluginApiReturn<ComponentHandle>;
84
+ /**
85
+ * Create a **mass** — a generic extruded prism (default `massType` "Generic mass").
86
+ * Same footprint-extrude path as {@linkcode PluginDesignCreateApi.space}.
87
+ *
88
+ * @param contour - Footprint (outer + holes)
89
+ * @param height - Extrusion height (> 0)
90
+ * @param label - Label (maps to `room_type`)
91
+ * @param position - Offset from origin
92
+ * @param massType - Mass type (default `Generic mass`)
93
+ * @returns the {@linkcode ComponentHandle} of the created mass
94
+ * @throws if the contour is invalid or the height is not positive
95
+ *
96
+ * @examplePrompt Create a generic mass 30m tall from this footprint
97
+ * @examplePrompt Block out a conceptual massing volume for the site
98
+ * @examplePrompt Extrude this shape into a building mass
99
+ * @examplePrompt Add a simple study-model volume at the origin
100
+ *
101
+ * # Example
102
+ * ```ts
103
+ * const rect = await snaptrude.core.geom.create.profileRect(20, 15)
104
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
105
+ * const tower = await snaptrude.design.create.mass(contour, 30, "Tower A", undefined, "Building")
106
+ * ```
107
+ */
108
+ abstract mass(contour: ContourHandle, height: number, label?: string, position?: Vec3Handle, massType?: PluginMassType): PluginApiReturn<ComponentHandle>;
109
+ /**
110
+ * Create a **mass** from a custom solid built with a `core.geom.create` brep
111
+ * constructor (`brepFromFaces`, `brepFromExtrusion`, `brepFromLoft`,
112
+ * `brepFromMesh`, or a brep boolean) — the free-form counterpart of
113
+ * {@linkcode PluginDesignCreateApi.mass}, for solids that are not simple
114
+ * footprint extrusions (pyramids, wedges, faceted volumes).
115
+ *
116
+ * Only accepts breps **minted by a `core.geom.create` brep constructor** —
117
+ * scene-derived breps from `design.query.geometry.getBrep` are read-only and
118
+ * throw. The mass is created as a generic mass (`massType` "Generic mass") at
119
+ * the exact coordinates the solid was authored in, committed as a single
120
+ * undo step, and synced to collaborators like any other creator.
121
+ *
122
+ * @param brep - A solid from a `core.geom.create` brep constructor
123
+ * @param label - Label (maps to `room_type`)
124
+ * @returns the {@linkcode ComponentHandle} of the created mass
125
+ * @throws if the brep handle is invalid, or the brep was not created by a
126
+ * `core.geom.create` brep constructor
127
+ *
128
+ * @examplePrompt Create a mass from these faces
129
+ * @examplePrompt Turn this custom brep into a scene mass
130
+ * @examplePrompt Add a pyramid-shaped mass to the model
131
+ *
132
+ * # Example
133
+ * ```ts
134
+ * const apex = { x: 0, y: 4, z: 0 }
135
+ * const a = { x: -2, y: 0, z: -2 }
136
+ * const b = { x: 2, y: 0, z: -2 }
137
+ * const c = { x: 2, y: 0, z: 2 }
138
+ * const d = { x: -2, y: 0, z: 2 }
139
+ * const brep = await snaptrude.core.geom.create.brepFromFaces([
140
+ * [a, d, c, b],
141
+ * [a, b, apex],
142
+ * [b, c, apex],
143
+ * [c, d, apex],
144
+ * [d, a, apex],
145
+ * ])
146
+ * const pyramid = await snaptrude.design.create.massFromBrep(brep, "Pavilion")
147
+ * ```
148
+ */
149
+ abstract massFromBrep(brep: BrepHandle, label?: string): PluginApiReturn<ComponentHandle>;
150
+ /**
151
+ * Create a **slab** by extruding a footprint contour by `thickness`
152
+ * (default direction: down).
153
+ *
154
+ * @param contour - Footprint (outer + holes)
155
+ * @param thickness - Slab thickness (> 0)
156
+ * @param direction - Extrusion direction (default `"down"`)
157
+ * @param slabType - Slab-type classification
158
+ * @returns the {@linkcode ComponentHandle} of the created slab
159
+ * @throws if the contour is invalid or the thickness is not positive
160
+ *
161
+ * @examplePrompt Add a 150mm thick slab under this footprint
162
+ * @examplePrompt Create a floor slab from this outline
163
+ * @examplePrompt Pour a plinth slab over the building footprint
164
+ * @examplePrompt Make a basement slab that extrudes downward
165
+ * @examplePrompt Give this room outline a 6 inch slab
166
+ *
167
+ * # Example
168
+ * ```ts
169
+ * const rect = await snaptrude.core.geom.create.profileRect(12, 10)
170
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
171
+ * const slab = await snaptrude.design.create.slab(contour, 0.15, "down", "Plinth")
172
+ * ```
173
+ */
174
+ abstract slab(contour: ContourHandle, thickness: number, direction?: "up" | "down", slabType?: PluginSlabType): PluginApiReturn<ComponentHandle>;
175
+ /**
176
+ * Create a **floor** by extruding a footprint contour by `thickness`
177
+ * (extruded upward).
178
+ *
179
+ * @param contour - Footprint (outer + holes)
180
+ * @param thickness - Floor thickness (> 0)
181
+ * @param position - Offset from origin
182
+ * @returns the {@linkcode ComponentHandle} of the created floor
183
+ * @throws if the contour is invalid or the thickness is not positive
184
+ *
185
+ * @examplePrompt Create a floor from this room outline
186
+ * @examplePrompt Add a 100mm thick floor over the footprint
187
+ * @examplePrompt Lay flooring across the selected outline
188
+ * @examplePrompt Put a floor at this position with 150mm thickness
189
+ *
190
+ * # Example
191
+ * ```ts
192
+ * const rect = await snaptrude.core.geom.create.profileRect(5, 4)
193
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
194
+ * const floor = await snaptrude.design.create.floor(contour, 0.1)
195
+ * ```
196
+ *
197
+ * @performance For MORE THAN ONE floor, call `design.create.floors(items[])` — one
198
+ * host round-trip and ONE undo entry for the whole batch. Looping this single-floor
199
+ * creator is N round-trips and N undo entries.
200
+ */
201
+ abstract floor(contour: ContourHandle, thickness: number, position?: Vec3Handle): PluginApiReturn<ComponentHandle>;
202
+ /**
203
+ * Create **many floors** in one undoable operation (bulk plural of
204
+ * {@linkcode floor}). Each item extrudes its own footprint contour (outer
205
+ * profile + holes) upward by its own `thickness`, at its own optional
206
+ * position offset. Validate-all-or-throw; one command.
207
+ *
208
+ * @param items - One {@linkcode PluginCreateFloorItem} per floor to create
209
+ * (≥1, ≤1000)
210
+ * @returns the created floors as {@linkcode ComponentHandle}`[]`, in input order
211
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
212
+ * 1000 items, a non-positive thickness) or a contour is degenerate;
213
+ * `HANDLE_INVALID` if a `contour` or `position` handle is unknown or
214
+ * released; `OPERATION_FAILED` if extrusion fails (nothing is created —
215
+ * `details.itemIndex` is the failing item); `METHOD_NOT_PERMITTED` if the
216
+ * plugin may not write.
217
+ *
218
+ * @examplePrompt Create floors for all these room outlines at once
219
+ * @examplePrompt Add a floor to every space in one operation
220
+ * @examplePrompt Bulk create the floor plates for this building
221
+ * @examplePrompt Lay 100mm floors across these five footprints in one undo step
222
+ * @examplePrompt Create the ground and first floor slabs together
223
+ *
224
+ * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
225
+ * entry. Always prefer this over calling `design.create.floor` in a loop: build the
226
+ * full `items[]` array first (all contours and offsets up front), then make one call.
227
+ *
228
+ * # Example
229
+ * ```ts
230
+ * const rect = await snaptrude.core.geom.create.profileRect(5, 4)
231
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
232
+ * const [ground, upper] = await snaptrude.design.create.floors([
233
+ * { contour, thickness: 0.1 },
234
+ * { contour, thickness: 0.1, position: await snaptrude.core.math.vec3.new(0, 3, 0) },
235
+ * ])
236
+ * ```
237
+ */
238
+ abstract floors(items: PluginCreateFloorItem[]): PluginApiReturn<ComponentHandle[]>;
239
+ /**
240
+ * Create a **roof** by extruding a footprint contour by `thickness`. Created
241
+ * flat (extruded downward); pitch/slope is a separate post-creation edit.
242
+ *
243
+ * @param contour - Footprint (outer + holes)
244
+ * @param thickness - Roof-slab thickness (> 0)
245
+ * @returns the {@linkcode ComponentHandle} of the created roof
246
+ * @throws if the contour is invalid or the thickness is not positive
247
+ *
248
+ * @examplePrompt Add a flat roof over the building footprint
249
+ * @examplePrompt Create a roof 200mm thick from this outline
250
+ * @examplePrompt Cover the top storey with a roof slab
251
+ * @examplePrompt Put a roof on this building
252
+ *
253
+ * # Example
254
+ * ```ts
255
+ * const rect = await snaptrude.core.geom.create.profileRect(12, 10)
256
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
257
+ * const roof = await snaptrude.design.create.roof(contour, 0.2)
258
+ * ```
259
+ */
260
+ abstract roof(contour: ContourHandle, thickness: number): PluginApiReturn<ComponentHandle>;
261
+ /**
262
+ * Create a **ceiling** by extruding a footprint contour by `thickness`, lifted
263
+ * `heightFromFloor` above the floor.
264
+ *
265
+ * @param contour - Footprint (outer + holes)
266
+ * @param thickness - Ceiling thickness (> 0)
267
+ * @param heightFromFloor - Lift above the floor (default 0)
268
+ * @returns the {@linkcode ComponentHandle} of the created ceiling
269
+ * @throws if the contour is invalid or the thickness is not positive
270
+ *
271
+ * @examplePrompt Add a false ceiling 2.7m above the floor
272
+ * @examplePrompt Create a ceiling over this room footprint
273
+ * @examplePrompt Put a dropped ceiling in the living room at 3 metres
274
+ * @examplePrompt Add a 50mm thick ceiling lifted 2800mm from floor level
275
+ *
276
+ * # Example
277
+ * ```ts
278
+ * const rect = await snaptrude.core.geom.create.profileRect(5, 4)
279
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
280
+ * const ceiling = await snaptrude.design.create.ceiling(contour, 0.05, 2.8)
281
+ * ```
282
+ */
283
+ abstract ceiling(contour: ContourHandle, thickness: number, heightFromFloor?: number): PluginApiReturn<ComponentHandle>;
284
+ /**
285
+ * Create a **column** by extruding a cross-section contour upward by `height`
286
+ * from a base `position`. The column is built to EXACTLY `height` — unlike
287
+ * the interactive draw tool, no slab-thickness deduction is applied.
288
+ *
289
+ * @param position - Base point
290
+ * @param crossSection - Column cross-section footprint
291
+ * @param height - Column height (> 0), built exactly
292
+ * @param directionUp - Up axis (default world up); normalized by the host, so
293
+ * magnitude does not scale the height
294
+ * @returns the {@linkcode ComponentHandle} of the created column
295
+ * @throws if the cross-section is invalid, the height is not positive, or the
296
+ * direction is zero / lies in the cross-section plane (degenerate extrusion)
297
+ *
298
+ * @examplePrompt Add a 3m tall column at this point
299
+ * @examplePrompt Place a column at the grid intersection
300
+ * @examplePrompt Create a 450mm square concrete column 4 metres high
301
+ * @examplePrompt Stand a column up from this base point
302
+ *
303
+ * # Example
304
+ * ```ts
305
+ * const rect = await snaptrude.core.geom.create.profileRect(0.45, 0.45)
306
+ * const crossSection = await snaptrude.core.geom.create.contourFromProfile(rect)
307
+ * const base = await snaptrude.core.math.vec3.new(4, 0, 4)
308
+ * const column = await snaptrude.design.create.column(base, crossSection, 3)
309
+ * ```
310
+ */
311
+ abstract column(position: Vec3Handle, crossSection: ContourHandle, height: number, directionUp?: Vec3Handle): PluginApiReturn<ComponentHandle>;
312
+ /**
313
+ * Create a **beam** by extruding a cross-section contour along `direction` by
314
+ * `length`. Matches the Snaptrude beam tool's semantics: the beam body hangs
315
+ * BELOW the plane the section is authored on.
316
+ *
317
+ * For a **horizontal** `direction` (the common spanning beam), author the
318
+ * section as an axis-aligned plan rectangle: its X extent is the beam's
319
+ * width, its Z extent is the beam's depth (the vertical drop). The beam runs
320
+ * `length` along `direction` starting at the section's centre, hanging below
321
+ * the authoring plane by its depth — exactly like an interactively drawn
322
+ * beam. Only axis-aligned rectangular sections are supported horizontally.
323
+ *
324
+ * For a **vertical** `direction` (the default), the section itself is
325
+ * extruded by `length`, again hanging below the authoring plane. Diagonal
326
+ * directions are rejected.
327
+ *
328
+ * @param section - Beam cross-section, an axis-aligned rectangle in plan
329
+ * (X extent = width, Z extent = depth)
330
+ * @param length - Beam length along `direction` (> 0); direction is
331
+ * normalized by the host, so magnitude does not scale the length
332
+ * @param direction - Beam axis: horizontal for a spanning beam, or vertical
333
+ * (default world up). Diagonal directions throw.
334
+ * @returns the {@linkcode ComponentHandle} of the created beam
335
+ * @throws if the section is invalid (horizontal beams: not an axis-aligned
336
+ * plan rectangle), the length is not positive, or the direction is zero or
337
+ * diagonal
338
+ *
339
+ * @examplePrompt Add a beam spanning 6 metres between the columns
340
+ * @examplePrompt Create a horizontal beam along the X axis
341
+ * @examplePrompt Run a 300x600 beam across the room
342
+ * @examplePrompt Extrude this cross-section into a 5m long beam
343
+ *
344
+ * # Example
345
+ * ```ts
346
+ * const rect = await snaptrude.core.geom.create.profileRect(0.3, 0.6)
347
+ * const section = await snaptrude.core.geom.create.contourFromProfile(rect)
348
+ * const alongX = await snaptrude.core.math.vec3.new(1, 0, 0)
349
+ * const beam = await snaptrude.design.create.beam(section, 6, alongX)
350
+ * ```
351
+ */
352
+ abstract beam(section: ContourHandle, length: number, direction?: Vec3Handle): PluginApiReturn<ComponentHandle>;
353
+ /**
354
+ * Create a connected run of **walls** from a profile — one wall per curve in
355
+ * the profile's chain, with mitred corners at shared endpoints.
356
+ *
357
+ * @param profile - Ordered curve chain (wall centerlines)
358
+ * @param height - Wall height (default engine default)
359
+ * @param thickness - Wall thickness (default: the `wallType`'s total layer
360
+ * thickness when `wallType` is given, else the engine default)
361
+ * @param wallType - Wall type to build with — the same searchable list the
362
+ * Draw tab's Wall Type dropdown offers. Pass a name from
363
+ * `design.types.list("wall")` (the summary's `label`, or its `"wall:…"` id).
364
+ * Drives the wall's construction layers and default material, and — when
365
+ * `thickness` is omitted — its total layer thickness. Default: the engine's
366
+ * generic wall.
367
+ * @param storey - Target storey (integer: `1` ground, `2` first floor, `-1`
368
+ * basement — same convention as `design.create.space`). The walls are
369
+ * assigned to it and lifted to its base elevation, all inside the same
370
+ * single undo entry. The storey must already exist
371
+ * (`core.storeys.create` first). Default: geometry-derived — a profile
372
+ * drawn at y = 0 lands on storey 1; the ACTIVE storey is NOT consulted.
373
+ * @returns a {@linkcode ComponentHandle}`[]` (one per wall), in profile order
374
+ * @throws if the profile is empty, `wallType` names no wall type in the
375
+ * project, `storey` does not exist, or wall creation fails
376
+ *
377
+ * @examplePrompt Draw walls along this centerline
378
+ * @examplePrompt Create 3m high, 200mm thick walls from these points
379
+ * @examplePrompt Build a wall run around the room outline
380
+ * @examplePrompt Turn this polyline sketch into walls
381
+ * @examplePrompt Add walls with mitred corners along the path
382
+ * @examplePrompt Draw brick walls with plaster along this outline
383
+ * @examplePrompt Build the perimeter in exposed concrete walls
384
+ *
385
+ * # Example
386
+ * ```ts
387
+ * const v = snaptrude.core.math.vec3
388
+ * const centerlines = await snaptrude.core.geom.create.profileFromLinePoints([
389
+ * await v.new(0, 0, 0),
390
+ * await v.new(8, 0, 0),
391
+ * await v.new(8, 0, 6),
392
+ * ])
393
+ * const walls = await snaptrude.design.create.walls(centerlines, 3, 0.2)
394
+ * // …built as a specific wall type (layers/material/thickness from the type):
395
+ * const [brick] = await snaptrude.design.types.list("wall")
396
+ * const brickWalls = await snaptrude.design.create.walls(
397
+ * centerlines, 3, undefined, brick.label,
398
+ * )
399
+ * ```
400
+ *
401
+ * @performance For MORE THAN ONE run, call `design.create.wallRuns(items[])` — one
402
+ * host round-trip and ONE undo entry for every run in the batch. Looping this
403
+ * single-run creator is N round-trips and N undo entries.
404
+ */
405
+ abstract walls(profile: ProfileHandle, height?: number, thickness?: number, wallType?: string, storey?: number): PluginApiReturn<ComponentHandle[]>;
406
+ /**
407
+ * Create **many wall runs** in one undoable operation (bulk plural of
408
+ * {@linkcode walls}). Each item is one full run — a wall per curve in that
409
+ * item's profile chain, mitred at shared endpoints. Junctions resolve within a
410
+ * run, not between runs. Each item carries its own
411
+ * dimensions, `wallType` and `storey`, so a single call can build a whole
412
+ * floor plate or several storeys at once. Validate-all-or-throw; one command.
413
+ *
414
+ * @param items - One {@linkcode PluginCreateWallRunItem} per run to create
415
+ * (≥1, ≤1000)
416
+ * @returns one {@linkcode ComponentHandle}`[]` per item, in input order —
417
+ * each inner array holding that run's walls in profile-curve order
418
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
419
+ * 1000 items, a non-positive height or thickness, a zero-length curve);
420
+ * `HANDLE_INVALID` if a `profile` handle is unknown or released;
421
+ * `PRECONDITION_FAILED` if a profile has no curves, `wallType` names no
422
+ * wall type in the project, or `storey` does not exist;
423
+ * `OPERATION_FAILED` if wall creation fails (nothing is created —
424
+ * `details.itemIndex` is the failing item); `METHOD_NOT_PERMITTED` if the
425
+ * plugin may not write.
426
+ *
427
+ * @examplePrompt Draw all the walls of this floor plan at once
428
+ * @examplePrompt Build every room's perimeter in one operation
429
+ * @examplePrompt Bulk create wall runs from these centerlines
430
+ * @examplePrompt Create the walls for both storeys in a single undo step
431
+ * @examplePrompt Turn these polylines into 200mm brick walls together
432
+ *
433
+ * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
434
+ * entry. Always prefer this over calling `design.create.walls` in a loop: build the
435
+ * full `items[]` array first (all profiles up front), then make one call.
436
+ *
437
+ * # Example
438
+ * ```ts
439
+ * const v = snaptrude.core.math.vec3
440
+ * const ground = await snaptrude.core.geom.create.profileFromLinePoints([
441
+ * await v.new(0, 0, 0),
442
+ * await v.new(8, 0, 0),
443
+ * await v.new(8, 0, 6),
444
+ * ])
445
+ * const upper = await snaptrude.core.geom.create.profileFromLinePoints([
446
+ * await v.new(0, 0, 0),
447
+ * await v.new(8, 0, 0),
448
+ * ])
449
+ * const [groundWalls, upperWalls] = await snaptrude.design.create.wallRuns([
450
+ * { profile: ground, height: 3, thickness: 0.2 },
451
+ * { profile: upper, height: 3, storey: 2 },
452
+ * ])
453
+ * console.log(groundWalls.length, "walls on the ground floor")
454
+ * ```
455
+ */
456
+ abstract wallRuns(items: PluginCreateWallRunItem[]): PluginApiReturn<ComponentHandle[][]>;
457
+ /**
458
+ * Create a **staircase** from a parametric preset, placed at a point.
459
+ *
460
+ * Geometry is procedurally generated from the chosen `preset`; there is no
461
+ * footprint input. Placed on the active structure/story unless overridden.
462
+ * The promise resolves only after the staircase's asynchronous geometry union
463
+ * and creation-command capture settle; a union failure rejects the call.
464
+ *
465
+ * @param preset - The parametric preset to generate
466
+ * @param position - Placement point
467
+ * @param label - Optional label
468
+ * @param structureId - Target structure (default active)
469
+ * @param level - Target level name (default active/`"01"`)
470
+ * @param dimensions - Optional positive dimension overrides in Snaptrude engine
471
+ * units, plus a placement angle in 90-degree increments. Overrides are
472
+ * applied to the staircase parameters before the creation command runs.
473
+ * @returns the {@linkcode ComponentHandle} of the created staircase
474
+ * @throws if the preset is unknown or placement fails
475
+ *
476
+ * @examplePrompt Add a dog-legged staircase at this location
477
+ * @examplePrompt Place a straight stair on level 01
478
+ * @examplePrompt Create an L-shaped staircase in the lobby
479
+ * @examplePrompt Insert a staircase near the entrance
480
+ * @examplePrompt Put amphitheatre steps at these coordinates
481
+ *
482
+ * # Example
483
+ * ```ts
484
+ * const stair = await snaptrude.design.create.staircase(
485
+ * "dogLegged",
486
+ * await snaptrude.core.math.vec3.new(5, 0, 5),
487
+ * )
488
+ * ```
489
+ */
490
+ abstract staircase(preset: PluginStaircasePreset, position: Vec3Handle, label?: string, structureId?: string, level?: string, dimensions?: PluginStaircaseDimensions): PluginApiReturn<ComponentHandle>;
491
+ /**
492
+ * Create **reference lines** from a profile — one reference line per curve in
493
+ * the profile's ordered chain. Returns a handle per created line.
494
+ *
495
+ * Optional style (`color`, `thickness`, `style`, `gridTag`) applies to
496
+ * every created line.
497
+ *
498
+ * @param profile - Ordered curve chain (centerlines)
499
+ * @param color - Hex color `"#RRGGBB"` (default white)
500
+ * @param thickness - Line thickness (default 1)
501
+ * @param style - Line style (default `SOLID`)
502
+ * @param gridTag - Grid tag label (default `"A"`)
503
+ * @returns a {@linkcode ComponentHandle}`[]` (one per curve), in profile order
504
+ * @throws if the profile is empty or creation fails
505
+ *
506
+ * @examplePrompt Draw a reference line between these two points
507
+ * @examplePrompt Add dashed guide lines along this path
508
+ * @examplePrompt Create grid lines tagged A through the plan
509
+ * @examplePrompt Set up construction lines for the column grid
510
+ * @examplePrompt Mark a red reference line across the site
511
+ *
512
+ * # Example
513
+ * ```ts
514
+ * const v = snaptrude.core.math.vec3
515
+ * const profile = await snaptrude.core.geom.create.profileFromLinePoints([
516
+ * await v.new(0, 0, 0),
517
+ * await v.new(10, 0, 0),
518
+ * ])
519
+ * const lines = await snaptrude.design.create.referenceLines(
520
+ * profile,
521
+ * undefined,
522
+ * undefined,
523
+ * "DASHED",
524
+ * )
525
+ * ```
526
+ */
527
+ abstract referenceLines(profile: ProfileHandle, color?: string, thickness?: number, style?: PluginReferenceLineStyle, gridTag?: string): PluginApiReturn<ComponentHandle[]>;
528
+ /**
529
+ * Create a free rectangular **structural grid** — one grid group with two
530
+ * perpendicular line families (`linesX` lines spaced `spacingX` apart, and
531
+ * `linesY` lines spaced `spacingY` apart) on the active storey. One undoable
532
+ * creation.
533
+ *
534
+ * Units: spacings in Snaptrude units; `angle` in degrees (CCW about +Y,
535
+ * default 0). Without `center` the grid is centred on the current viewport
536
+ * (the native tool's behavior) — pass `center` for deterministic placement.
537
+ *
538
+ * @param linesX - Line count of the first family (integer ≥ 1)
539
+ * @param linesY - Line count of the second family (integer ≥ 1)
540
+ * @param spacingX - First-family spacing (Snaptrude units, > 0)
541
+ * @param spacingY - Second-family spacing (Snaptrude units, > 0)
542
+ * @param options - `angle`, `center`, and {@linkcode PluginGridStyleOptions}
543
+ * @returns the created grid group's {@linkcode ComponentHandle}
544
+ *
545
+ * @examplePrompt Create a 5 by 8 structural grid with 6 metre spacing
546
+ * @examplePrompt Add a column grid rotated 30 degrees
547
+ * @examplePrompt Set up a structural grid at the site origin
548
+ *
549
+ * # Example
550
+ * ```ts
551
+ * const centre = await snaptrude.core.math.vec3.new(0, 0, 0)
552
+ * const grid = await snaptrude.design.create.grid(5, 8, 6, 6, { center: centre })
553
+ * ```
554
+ */
555
+ abstract grid(linesX: number, linesY: number, spacingX: number, spacingY: number, options?: {
556
+ angle?: number;
557
+ center?: Vec3Handle;
558
+ } & PluginGridStyleOptions): PluginApiReturn<ComponentHandle>;
559
+ /**
560
+ * Create a **structural grid from a single curve** — one grid group holding
561
+ * one wing with one line (the draw tool's output). The curve may be a line
562
+ * or an arc; circles are rejected with `VALIDATION`. Undoable.
563
+ *
564
+ * @param curve - The grid line's geometry ({@linkcode CurveHandle}, world space)
565
+ * @param options - `tag` (defaults to the draw tool's next tag) and
566
+ * {@linkcode PluginGridStyleOptions}
567
+ * @returns the created grid group's {@linkcode ComponentHandle}
568
+ *
569
+ * @examplePrompt Draw a grid line from A to B
570
+ * @examplePrompt Add a curved grid line through these points
571
+ * @examplePrompt Create grid line "C" along this wall
572
+ *
573
+ * # Example
574
+ * ```ts
575
+ * const { vec3 } = snaptrude.core.math
576
+ * const from = await vec3.new(0, 0, 0)
577
+ * const to = await vec3.new(30, 0, 0)
578
+ * const curve = await snaptrude.core.geom.create.line(from, to)
579
+ * const grid = await snaptrude.design.create.gridFromCurve(curve, { tag: "A" })
580
+ * ```
581
+ */
582
+ abstract gridFromCurve(curve: CurveHandle, options?: {
583
+ tag?: string;
584
+ } & PluginGridStyleOptions): PluginApiReturn<ComponentHandle>;
585
+ /**
586
+ * Generate **structural grids fitted to mass footprints** — one grid group
587
+ * per footprint cluster, with counts and orientation derived from each
588
+ * footprint's geometry and the given spacings. All created groups commit as
589
+ * ONE undoable unit.
590
+ *
591
+ * Lenient like the native tool: masses without an extractable footprint
592
+ * (no B-rep, degenerate top face) are skipped; throws `VALIDATION` only when
593
+ * NONE of the given masses yields a footprint.
594
+ *
595
+ * @param masses - Masses whose footprints seat the grids
596
+ * @param spacingX - First-family spacing (Snaptrude units, > 0)
597
+ * @param spacingY - Second-family spacing (Snaptrude units, > 0)
598
+ * @param options - {@linkcode PluginGridStyleOptions}
599
+ * @returns the created grid groups' {@linkcode ComponentHandle}`[]`
600
+ *
601
+ * @examplePrompt Generate grids for the selected masses
602
+ * @examplePrompt Auto-generate a 6m structural grid on this building
603
+ * @examplePrompt Fit column grids to every mass on this storey
604
+ *
605
+ * # Example
606
+ * ```ts
607
+ * const masses = await snaptrude.design.query.listMasses({ storeys: [1] })
608
+ * const grids = await snaptrude.design.create.gridsFromMasses(masses, 6, 6)
609
+ * ```
610
+ */
611
+ abstract gridsFromMasses(masses: ComponentHandle[], spacingX: number, spacingY: number, options?: PluginGridStyleOptions): PluginApiReturn<ComponentHandle[]>;
612
+ /**
613
+ * Create **columns at every grid-line intersection** of the given grid
614
+ * groups, sized `width` × `depth` and oriented to the grid axes, on the
615
+ * grids' storey. All columns commit as ONE undoable unit.
616
+ *
617
+ * @param grids - Grid groups whose intersections seat the columns
618
+ * @param width - Column width (Snaptrude units, > 0)
619
+ * @param depth - Column depth (Snaptrude units, > 0)
620
+ * @returns the created columns' {@linkcode ComponentHandle}`[]`
621
+ * @throws `VALIDATION` when an id does not resolve to a grid group;
622
+ * `OPERATION_FAILED` when the grids have no line intersections
623
+ *
624
+ * @examplePrompt Generate columns on this grid
625
+ * @examplePrompt Place 450mm square columns at every grid intersection
626
+ *
627
+ * # Example
628
+ * ```ts
629
+ * const grids = await snaptrude.design.query.listGrids()
630
+ * const columns = await snaptrude.design.create.columnsFromGrids(grids, 0.45, 0.45)
631
+ * ```
632
+ */
633
+ abstract columnsFromGrids(grids: ComponentHandle[], width: number, depth: number): PluginApiReturn<ComponentHandle[]>;
634
+ /**
635
+ * Place a **furniture** item from the project library at a world position.
636
+ *
637
+ * Identified by a **catalog (library) id** — the team object's stable `_id` for
638
+ * project uploads, or the item's `fullName` for the general library. Discover ids
639
+ * with {@linkcode PluginDesignFurnitureApi.listCatalog}. Placement is asynchronous
640
+ * (the source mesh is fetched if not cached) and creates one undo entry.
641
+ *
642
+ * Placed at the item's default rotation unless `angleInDegrees` is given, which
643
+ * rotates it about the vertical axis at creation time (baked into the same undo
644
+ * entry). To rotate an existing instance instead, use `design.transform.rotate`.
645
+ *
646
+ * @param catalogId - Library id: team `_id` or general `fullName`
647
+ * @param position - Absolute world placement point. `position.y` is the REST
648
+ * elevation: the item is grounded so its bounding-box base sits exactly at
649
+ * `position.y` (the same surface-flush contract as interactive drag-drop) —
650
+ * pass the floor/storey elevation to stand furniture on it; never add half
651
+ * the item's height yourself.
652
+ * @param options - Optional placement options: `label` — instance name and
653
+ * readable label (`design.query.getLabel`; default auto `${name}Ins${n}`);
654
+ * `createNewSourceMesh` — legacy flag, kept for compatibility. The host owns
655
+ * source-mesh persistence: a catalog source is recorded exactly once, by the
656
+ * first placement that brings it in, and this flag cannot skip that record.
657
+ * @param angleInDegrees - Optional signed rotation about the vertical axis, in
658
+ * degrees (same convention as {@linkcode PluginDesignTransformApi.rotate}).
659
+ * Applied at creation time so it is part of the placement's single undo entry.
660
+ * Default: the item's own (unrotated) orientation.
661
+ * @returns the {@linkcode ComponentHandle} of the placed furniture instance
662
+ * @throws if the catalog id is unknown, the source mesh fails to load, or placement fails;
663
+ * `PRECONDITION_FAILED` (`details.engineCode: "TOOL_ACTIVE"`) while the interactive
664
+ * furniture tool is active — finish or cancel it first
665
+ *
666
+ * @examplePrompt Place a chair from the library at this spot
667
+ * @examplePrompt Add a sofa from the furniture catalog to the living room
668
+ * @examplePrompt Drop a desk into the scene at 3, 0, 5
669
+ * @examplePrompt Insert the uploaded bed model in the bedroom
670
+ * @examplePrompt Put a table from my project library here and name it Table-01
671
+ * @examplePrompt Place a chair here rotated 90 degrees
672
+ *
673
+ * # Example
674
+ * ```ts
675
+ * const chair = await snaptrude.design.create.furniture(
676
+ * "6620f1a…", // from design.furniture.listCatalog()
677
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
678
+ * { label: "Chair-01" },
679
+ * )
680
+ * // …placed already turned 90° about the vertical axis:
681
+ * const turned = await snaptrude.design.create.furniture(
682
+ * "6620f1a…",
683
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
684
+ * undefined,
685
+ * 90,
686
+ * )
687
+ * ```
688
+ *
689
+ * @performance For MORE THAN ONE item, call `design.create.furnitureItems(items[])` —
690
+ * one host round-trip and ONE undo entry, and a catalog source shared by several
691
+ * items is fetched once. Looping this single-item creator is N round-trips.
692
+ */
693
+ abstract furniture(catalogId: string, position: Vec3Handle, options?: {
694
+ label?: string;
695
+ createNewSourceMesh?: boolean;
696
+ }, angleInDegrees?: number): PluginApiReturn<ComponentHandle>;
697
+ /**
698
+ * Place **many furniture items** in one undoable operation (bulk plural of
699
+ * {@linkcode furniture}). Each item names a catalog id and an absolute world
700
+ * position (`position.y` is the REST elevation — the same grounding contract
701
+ * as the singular creator), with optional label and rotation. A catalog
702
+ * source shared by several items is fetched and recorded once for the whole
703
+ * batch, so the host — not the caller — owns source persistence (there is no
704
+ * per-item `createNewSourceMesh`). Validate-all-or-throw; one command.
705
+ *
706
+ * @param items - One {@linkcode PluginCreateFurnitureItem} per instance to
707
+ * place (≥1, ≤1000)
708
+ * @returns the placed instances as {@linkcode ComponentHandle}`[]`, in input order
709
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
710
+ * 1000 items); `HANDLE_INVALID` if a `position` handle is unknown or
711
+ * released; `PRECONDITION_FAILED` if a catalog id is unknown, a furniture
712
+ * tool is active, or a parametric group is active (exit it first, or place
713
+ * items one at a time with `furniture`); `OPERATION_FAILED` if a source
714
+ * mesh fails to load or placement fails (nothing is created —
715
+ * `details.itemIndex` is the failing item); `METHOD_NOT_PERMITTED` if the plugin may not write.
716
+ *
717
+ * @examplePrompt Place all the desks for this office at once
718
+ * @examplePrompt Furnish every bedroom in one operation
719
+ * @examplePrompt Bulk place these chairs around the table
720
+ * @examplePrompt Add the whole furniture layout in a single undo step
721
+ * @examplePrompt Drop twenty copies of this chair at these positions
722
+ *
723
+ * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
724
+ * entry, and each distinct catalog source loads once. Always prefer this over
725
+ * calling `design.create.furniture` in a loop: build the full `items[]` array
726
+ * first (all positions and angles up front), then make one call.
727
+ *
728
+ * # Example
729
+ * ```ts
730
+ * const v = snaptrude.core.math.vec3
731
+ * const [chair] = await snaptrude.design.furniture.listCatalog()
732
+ * const placed = await snaptrude.design.create.furnitureItems([
733
+ * { catalogId: chair.id, position: await v.new(3, 0, 5), label: "Chair-01" },
734
+ * { catalogId: chair.id, position: await v.new(4, 0, 5), angleInDegrees: 90 },
735
+ * { catalogId: chair.id, position: await v.new(5, 0, 5), angleInDegrees: 180 },
736
+ * ])
737
+ * ```
738
+ */
739
+ abstract furnitureItems(items: PluginCreateFurnitureItem[]): PluginApiReturn<ComponentHandle[]>;
740
+ /**
741
+ * Place a **door** from the catalog into a host wall.
742
+ *
743
+ * Identified by a **catalog (library) id** — the team object's stable `_id`
744
+ * or the general library's `fullName`. Discover ids with
745
+ * {@linkcode PluginDesignDoorsApi.listCatalog}. The world `position` is
746
+ * projected onto the host wall's face to locate the opening; the wall is
747
+ * re-cut and the door hosted in a single undo entry. Placement is
748
+ * asynchronous (the source mesh is fetched if not cached).
749
+ *
750
+ * @param catalogId - Library id: team `_id` or general `fullName`
751
+ * @param hostWall - The wall to host the door
752
+ * @param position - World point projected onto the wall to locate the opening
753
+ * @param options - Optional placement options: `label` — instance name;
754
+ * `hinge` — world point near the jamb the door is hinged on (the door is
755
+ * reflected along the wall so its hinged jamb is the one nearer this
756
+ * point; default the catalog item's authored hinge side)
757
+ * @param facing - World point on the side of the wall the door swings open
758
+ * to (the room it opens into — where the plan symbol draws the swing arc).
759
+ * Any point clearly on that side works (e.g. the room's center). Default:
760
+ * the engine picks a side (nondeterministic when `position` sits on the
761
+ * wall centerline).
762
+ * @returns the {@linkcode ComponentHandle} of the placed door
763
+ * @throws if the catalog id is unknown, the host is not a wall, the source
764
+ * mesh fails to load, or the projected point falls **outside** the host wall
765
+ *
766
+ * @examplePrompt Add a door to this wall here
767
+ * @examplePrompt Place a sliding door on the selected wall
768
+ * @examplePrompt Put a door from the catalog at this point on the wall
769
+ * @examplePrompt Insert the entrance door into this wall
770
+ * @examplePrompt Add a door to the wall and call it Entry-01
771
+ * @examplePrompt Add a door that opens into the living room
772
+ * @examplePrompt Put a door here hinged on the north jamb
773
+ *
774
+ * # Example
775
+ * ```ts
776
+ * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
777
+ * const [entry] = await snaptrude.design.doors.listCatalog()
778
+ * const door = await snaptrude.design.create.door(
779
+ * entry.id,
780
+ * wall,
781
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
782
+ * { label: "Entry-01" },
783
+ * )
784
+ * // …facing a specific side of the wall (pass a point inside that room):
785
+ * const intoKitchen = await snaptrude.design.create.door(
786
+ * entry.id,
787
+ * wall,
788
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
789
+ * undefined,
790
+ * await snaptrude.core.math.vec3.new(3, 0, 9),
791
+ * )
792
+ * // …and hinged on the jamb nearest a point (here the +x end of the opening):
793
+ * const hingedRight = await snaptrude.design.create.door(
794
+ * entry.id,
795
+ * wall,
796
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
797
+ * { hinge: await snaptrude.core.math.vec3.new(3.5, 0, 5) },
798
+ * await snaptrude.core.math.vec3.new(3, 0, 9),
799
+ * )
800
+ * ```
801
+ *
802
+ * @performance For MORE THAN ONE door, call `design.create.doors(items[])` — one host
803
+ * round-trip and ONE undo entry, with each host wall re-cut once per opening inside
804
+ * that single call. Looping this single-door creator is N round-trips.
805
+ */
806
+ abstract door(catalogId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
807
+ label?: string;
808
+ hinge?: Vec3Handle;
809
+ }, facing?: Vec3Handle): PluginApiReturn<ComponentHandle>;
810
+ /**
811
+ * Place **many doors** into host walls in one undoable operation (bulk plural
812
+ * of {@linkcode door}). Each item carries its own catalog id, host wall,
813
+ * world position, and optional `facing`, `label`, `width` and `height` — the
814
+ * same fields as a `"door"` {@linkcode PluginDesignCreateOpeningOptions}.
815
+ * Validate-all-or-throw; one command.
816
+ *
817
+ * As with the singular creator, placing an opening **re-cuts its host wall**:
818
+ * the wall you passed as `hostWall` stops resolving once the call returns.
819
+ * Several items MAY name the same original wall handle in one call — the host
820
+ * chains the re-cuts internally — but after the call recover the surviving
821
+ * wall with `design.query.getHost(opening)`, never by reusing the handle you
822
+ * passed in.
823
+ *
824
+ * @param items - One {@linkcode PluginCreateDoorItem} per door to place
825
+ * (≥1, ≤1000)
826
+ * @returns the placed doors as {@linkcode ComponentHandle}`[]`, in input order
827
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
828
+ * 1000 items, unknown fields, a non-positive `width`/`height`);
829
+ * `HANDLE_INVALID` if a `position`, `facing` or `hinge` handle is unknown
830
+ * or released; `PRECONDITION_FAILED` if a catalog id is unknown, a `hostWall`
831
+ * is not a wall / is locked / is not in the active proposal, the projected
832
+ * point falls outside its host wall, or a door tool is active;
833
+ * `OPERATION_FAILED` if a source mesh fails to load or placement fails
834
+ * (nothing is created — `details.itemIndex` is the failing item);
835
+ * `METHOD_NOT_PERMITTED` if the plugin may not write.
836
+ *
837
+ * @examplePrompt Add doors to all of these walls at once
838
+ * @examplePrompt Place a door in every room in one operation
839
+ * @examplePrompt Bulk add the entrance doors from this schedule
840
+ * @examplePrompt Put three doors on this wall in a single undo step
841
+ * @examplePrompt Add all the doors for this floor plan together
842
+ *
843
+ * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
844
+ * entry, and each distinct catalog source loads once. Always prefer this over
845
+ * calling `design.create.door` in a loop: build the full `items[]` array first
846
+ * (all host walls and points up front), then make one call.
847
+ *
848
+ * # Example
849
+ * ```ts
850
+ * const v = snaptrude.core.math.vec3
851
+ * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
852
+ * const [entry] = await snaptrude.design.doors.listCatalog()
853
+ * const [front, side] = await snaptrude.design.create.doors([
854
+ * { catalogId: entry.id, hostWall: wall, position: await v.new(2, 0, 5), label: "D-01" },
855
+ * { catalogId: entry.id, hostWall: wall, position: await v.new(6, 0, 5), width: 1.2 },
856
+ * ])
857
+ * // `wall` was re-cut twice and no longer resolves — ask the opening for its host:
858
+ * const currentWall = await snaptrude.design.query.getHost(front)
859
+ * ```
860
+ */
861
+ abstract doors(items: PluginCreateDoorItem[]): PluginApiReturn<ComponentHandle[]>;
862
+ /**
863
+ * Place a **window** from the catalog into a host wall.
864
+ *
865
+ * Identified by a **catalog (library) id** — the team object's stable `_id`
866
+ * or the general library's `fullName`. Discover ids with
867
+ * {@linkcode PluginDesignWindowsApi.listCatalog}. The world `position` is
868
+ * projected onto the host wall's face to locate the opening; the wall is
869
+ * re-cut and the window hosted in a single undo entry. Placement is
870
+ * asynchronous (the source mesh is fetched if not cached).
871
+ *
872
+ * @param catalogId - Library id: team `_id` or general `fullName`
873
+ * @param hostWall - The wall to host the window
874
+ * @param position - World point projected onto the wall to locate the opening
875
+ * @param options - Optional placement options: `label` — instance name;
876
+ * `hinge` — world point near the jamb the window is hinged on (same rule
877
+ * as {@linkcode PluginDesignCreateApi.door}; default the catalog item's
878
+ * authored side)
879
+ * @param facing - World point on the side of the wall the window opens to
880
+ * (matters for asymmetric windows, e.g. casement swing) — same convention
881
+ * as {@linkcode PluginDesignCreateApi.door}. Default: the engine picks a
882
+ * side (nondeterministic when `position` sits on the centerline).
883
+ * @returns the {@linkcode ComponentHandle} of the placed window
884
+ * @throws if the catalog id is unknown, the host is not a wall, the source
885
+ * mesh fails to load, or the projected point falls **outside** the host wall
886
+ *
887
+ * @examplePrompt Add a window to this wall here
888
+ * @examplePrompt Place a casement window on the selected wall
889
+ * @examplePrompt Put a window from the catalog at this point on the wall
890
+ * @examplePrompt Insert a window into the living room wall
891
+ * @examplePrompt Add a window to the wall and name it Win-01
892
+ * @examplePrompt Add a casement window opening toward the garden side
893
+ *
894
+ * # Example
895
+ * ```ts
896
+ * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
897
+ * const [entry] = await snaptrude.design.windows.listCatalog()
898
+ * const window = await snaptrude.design.create.window(
899
+ * entry.id,
900
+ * wall,
901
+ * await snaptrude.core.math.vec3.new(3, 0, 5),
902
+ * { label: "Win-01" },
903
+ * )
904
+ * ```
905
+ *
906
+ * @performance For MORE THAN ONE window, call `design.create.windows(items[])` — one
907
+ * host round-trip and ONE undo entry, with each host wall re-cut once per opening
908
+ * inside that single call. Looping this single-window creator is N round-trips.
909
+ */
910
+ abstract window(catalogId: string, hostWall: ComponentHandle, position: Vec3Handle, options?: {
911
+ label?: string;
912
+ hinge?: Vec3Handle;
913
+ }, facing?: Vec3Handle): PluginApiReturn<ComponentHandle>;
914
+ /**
915
+ * Place **many windows** into host walls in one undoable operation (bulk
916
+ * plural of {@linkcode window}). Each item carries its own catalog id, host
917
+ * wall, world position, and optional `facing`, `label`, `width`, `height` and
918
+ * `sillHeight` — the same fields as a `"window"`
919
+ * {@linkcode PluginDesignCreateOpeningOptions}. `sillHeight` is measured from
920
+ * the host wall base to the BOTTOM of the window. Validate-all-or-throw; one
921
+ * command.
922
+ *
923
+ * As with the singular creator, placing an opening **re-cuts its host wall**:
924
+ * the wall you passed as `hostWall` stops resolving once the call returns.
925
+ * Several items MAY name the same original wall handle in one call — the host
926
+ * chains the re-cuts internally — but after the call recover the surviving
927
+ * wall with `design.query.getHost(opening)`, never by reusing the handle you
928
+ * passed in.
929
+ *
930
+ * @param items - One {@linkcode PluginCreateWindowItem} per window to place
931
+ * (≥1, ≤1000)
932
+ * @returns the placed windows as {@linkcode ComponentHandle}`[]`, in input order
933
+ * @throws `VALIDATION` if the items fail the schema (empty array, more than
934
+ * 1000 items, unknown fields, a non-positive `width`/`height`, a negative
935
+ * `sillHeight`); `HANDLE_INVALID` if a `position`, `facing` or `hinge`
936
+ * handle is unknown or released; `PRECONDITION_FAILED` if a catalog id is unknown, a
937
+ * `hostWall` is not a wall / is locked / is not in the active proposal, the
938
+ * projected point falls outside its host wall, or a window tool is active;
939
+ * `OPERATION_FAILED` if a source mesh fails to load or placement fails
940
+ * (nothing is created — `details.itemIndex` is the failing item);
941
+ * `METHOD_NOT_PERMITTED` if the plugin may not write.
942
+ *
943
+ * @examplePrompt Add windows along this whole facade at once
944
+ * @examplePrompt Place a window in every bedroom in one operation
945
+ * @examplePrompt Bulk add the windows from this schedule
946
+ * @examplePrompt Put four windows on this wall in a single undo step
947
+ * @examplePrompt Add all the windows with a 0.9m sill height together
948
+ *
949
+ * @performance Bulk creator — the whole batch is ONE host round-trip and ONE undo
950
+ * entry, and each distinct catalog source loads once. Always prefer this over
951
+ * calling `design.create.window` in a loop: build the full `items[]` array first
952
+ * (all host walls and points up front), then make one call.
953
+ *
954
+ * # Example
955
+ * ```ts
956
+ * const v = snaptrude.core.math.vec3
957
+ * const [wall] = await snaptrude.design.query.listWalls({ isSelected: true })
958
+ * const [casement] = await snaptrude.design.windows.listCatalog()
959
+ * const placed = await snaptrude.design.create.windows([
960
+ * { catalogId: casement.id, hostWall: wall, position: await v.new(2, 0, 5), sillHeight: 0.9 },
961
+ * { catalogId: casement.id, hostWall: wall, position: await v.new(5, 0, 5), sillHeight: 0.9 },
962
+ * ])
963
+ * const currentWall = await snaptrude.design.query.getHost(placed[0])
964
+ * ```
965
+ */
966
+ abstract windows(items: PluginCreateWindowItem[]): PluginApiReturn<ComponentHandle[]>;
967
+ /**
968
+ * Place a catalog **door or window** into a host wall with optional size overrides.
969
+ *
970
+ * The world `position` is projected onto the host wall to locate the opening.
971
+ * All supplied dimensions use Snaptrude engine units. Window `sillHeight` is
972
+ * measured from the host wall base to the bottom of the window, not to
973
+ * its center. Placement is asynchronous and committed as one undoable creation.
974
+ *
975
+ * @param options - Opening kind, catalog and host references, placement, and
976
+ * optional facing (swing side), hinge (hinged jamb), label, and dimensions
977
+ * @returns the {@linkcode ComponentHandle} of the placed door or window
978
+ * @throws if the options are invalid, the catalog id is unknown, the host is
979
+ * not a wall, loading fails, or the opening cannot be placed on the host
980
+ *
981
+ * @examplePrompt Add a 1m wide door to this wall here
982
+ * @examplePrompt Place a window with a 0.9m sill height on the selected wall
983
+ *
984
+ * @performance Single-opening creator — use it for one hosted opening. For MORE
985
+ * THAN ONE, call `design.create.doors(items[])` / `design.create.windows(items[])`:
986
+ * the same per-item fields, one host round-trip, ONE undo entry.
987
+ *
988
+ * # Example
989
+ * ```ts
990
+ * const opening = await snaptrude.design.create.opening({
991
+ * kind: "window",
992
+ * catalogId: windowType.id,
993
+ * hostWall: wall,
994
+ * position: await snaptrude.core.math.vec3.new(3, 0, 5),
995
+ * width: 1.2,
996
+ * height: 1.5,
997
+ * sillHeight: 0.9,
998
+ * })
999
+ * ```
1000
+ */
1001
+ abstract opening(options: PluginDesignCreateOpeningOptions): PluginApiReturn<ComponentHandle>;
1002
+ /**
1003
+ * Place a **smart layout** — clone an in-scene template cluster (walls,
1004
+ * furniture, doors, windows, floors) into one or more target ROOM/DEPARTMENT
1005
+ * spaces, adapting orientation and fit to each target.
1006
+ *
1007
+ * Supply the template as **exactly one** of `templateGroup` (a group **id**
1008
+ * from `snaptrude.core.groups.list` — groups are string-id entities, not
1009
+ * component handles) or
1010
+ * `templateComponents` (an explicit component set); every target in `targets`
1011
+ * (≥1) receives its own placement. By default the target spaces are hidden
1012
+ * after placement (`hideTargets`, mirroring the product) — pass `false` to keep
1013
+ * them visible.
1014
+ *
1015
+ * The whole operation — every wall/opening/furniture/floor across every target,
1016
+ * plus the target-hide — is committed as a **single undo step**. Because all
1017
+ * targets merge into one creation batch, the created entities are returned
1018
+ * **flat, grouped by kind** ({@linkcode PluginSmartLayoutResult}), NOT attributed
1019
+ * per target (per-target attribution would break the single-undo guarantee).
1020
+ * `skippedWalls` is the interior-optimizer's best-candidate count of walls it
1021
+ * could not place. Synchronous and heavy — many targets can jank the main thread.
1022
+ *
1023
+ * @param options - {@linkcode PluginSmartLayoutArgs}: template source, targets, and `hideTargets`
1024
+ * @returns a {@linkcode PluginSmartLayoutResult} — created entities grouped by kind + `skippedWalls`
1025
+ * @throws if smart layout is not enabled, the template group is invalid, there
1026
+ * is no template / no targets / no valid mappings, or component creation fails
1027
+ *
1028
+ * @examplePrompt Copy this room's layout into the selected rooms
1029
+ * @examplePrompt Apply this furniture arrangement to the other offices
1030
+ * @examplePrompt Replicate this template into these two spaces
1031
+ * @examplePrompt Place this desk cluster into every meeting room
1032
+ * @examplePrompt Use this room as a template for the rooms I selected but keep them visible
1033
+ *
1034
+ * # Example
1035
+ * ```ts
1036
+ * const [templateRoom, ...targets] = await snaptrude.design.query.listSpaces({ isSelected: true })
1037
+ * const result = await snaptrude.design.create.smartLayout({
1038
+ * templateComponents: [templateRoom],
1039
+ * targets,
1040
+ * })
1041
+ * console.log("placed walls:", result.created.walls.length, "skipped:", result.skippedWalls)
1042
+ *
1043
+ * // …or clone a saved group by its id (from core.groups.list)
1044
+ * const { groups } = await snaptrude.core.groups.list()
1045
+ * await snaptrude.design.create.smartLayout({ templateGroup: groups[0].id, targets })
1046
+ * ```
1047
+ */
1048
+ abstract smartLayout(options: PluginSmartLayoutArgs): PluginApiReturn<PluginSmartLayoutResult>;
1049
+ /**
1050
+ * **Copy** existing entities, offsetting each copy by `displacement * i` (i = 1…count),
1051
+ * source positions preserved. Migrated from the removed `tools.copy`. In `"instance"`
1052
+ * mode copies stay in the source's instance family where possible; `"unique"` makes
1053
+ * independent geometry. The created copies become the active selection. Undoable.
1054
+ *
1055
+ * Runs on the engine's array-copy tool, so its semantics carry over: an
1056
+ * `"instance"` copy of a source that is not yet an instance **replaces that
1057
+ * source** with a fresh instance component — the handle you passed in stops
1058
+ * resolving after the call. Re-query (e.g. `design.query.listSpaces`) to pick
1059
+ * up the replacement before operating on that entity again; copying the stale
1060
+ * handle throws. `"unique"` mode never replaces sources.
1061
+ *
1062
+ * @param components - Entities to copy (≥1)
1063
+ * @param displacement - Per-copy offset as a {@linkcode Vec3Handle} (copy `i` at `displacement * i`)
1064
+ * @param options - `count` (copies per component, default 1), `mode` (`"instance"` | `"unique"`, default `"instance"`)
1065
+ * @returns the created copies as {@linkcode ComponentHandle}`[]`
1066
+ * @throws if a component handle is unknown or stale (replaced by an earlier
1067
+ * `"instance"` copy), `count` is not a positive integer, or the engine fails
1068
+ *
1069
+ * @examplePrompt Copy this room 3 times spaced 6m apart
1070
+ * @examplePrompt Duplicate the selected furniture along the X axis
1071
+ * @examplePrompt Make 5 copies of this column at 4 metre intervals
1072
+ * @examplePrompt Array these walls with a 3m offset
1073
+ * @examplePrompt Clone the desk as a unique copy, not an instance
1074
+ *
1075
+ * @performance To place N repeats of the same geometry, bulk-create the seed(s) once then
1076
+ * call this ONCE with `{ count: N - 1 }` — one host round-trip for all copies. Never
1077
+ * reproduce geometry by looping `design.create.*` N times. Copy only after the create
1078
+ * that mints the seed ids.
1079
+ *
1080
+ * # Example
1081
+ * ```ts
1082
+ * const { vec3 } = snaptrude.core.math
1083
+ * const copies = await snaptrude.design.create.copy(["space-id"], vec3.new(6, 0, 0), { count: 3 })
1084
+ * ```
1085
+ */
1086
+ abstract copy(components: ComponentHandle[], displacement: Vec3Handle, options?: {
1087
+ count?: number;
1088
+ mode?: PluginCopyMode;
1089
+ }): PluginApiReturn<ComponentHandle[]>;
1090
+ /**
1091
+ * Create **many spaces** in one undoable operation (bulk plural of {@linkcode space}).
1092
+ * Migrated from the removed `entity.space.bulkCreate`. Each item extrudes a contour
1093
+ * footprint up `height`. Validate-all-or-throw; one command. For a rectangular
1094
+ * (box) space, build the footprint with `core.geom.create.profileRect` →
1095
+ * `contourFromProfile`, then pass it as an item. Each item may carry its own
1096
+ * `storey` (see {@linkcode PluginCreateSpaceItem}) so a single call can populate
1097
+ * several floors at once.
1098
+ *
1099
+ * @param items - One {@linkcode PluginCreateSpaceItem} per space to create (≥1)
1100
+ * @returns the created spaces as {@linkcode ComponentHandle}`[]`, in input order
1101
+ * @throws if any item's contour is invalid, its height is not positive, or its
1102
+ * target `storey` does not exist (all-or-nothing — nothing is created)
1103
+ *
1104
+ * @examplePrompt Create several rooms at once from these footprints
1105
+ * @examplePrompt Generate all the bedrooms in one operation
1106
+ * @examplePrompt Bulk create the spaces for this floor plan
1107
+ * @examplePrompt Add three rooms with different heights in a single undo step
1108
+ * @examplePrompt Create one room on the ground floor and one on the first floor
1109
+ *
1110
+ * @performance Bulk creator — the whole batch is ONE host round-trip. Always prefer this
1111
+ * over calling `design.create.space` in a loop: build the full `items[]` array first
1112
+ * (all per-item math and geometry up front), then make one call.
1113
+ *
1114
+ * # Example
1115
+ * ```ts
1116
+ * const rect = await snaptrude.core.geom.create.profileRect(4, 3)
1117
+ * const contour = await snaptrude.core.geom.create.contourFromProfile(rect)
1118
+ * const [a, b] = await snaptrude.design.create.spaces([
1119
+ * { contour, height: 3, label: "R1" },
1120
+ * { contour, height: 4, label: "R2", position: await vec3.new(10, 0, 0) },
1121
+ * ])
1122
+ * ```
1123
+ */
1124
+ abstract spaces(items: PluginCreateSpaceItem[]): PluginApiReturn<ComponentHandle[]>;
1125
+ /**
1126
+ * Create a new parametric buildable envelope — the zoning-regulated volume a
1127
+ * building may occupy — generated from a site polygon, tiered setbacks, a
1128
+ * height or floor-count cap, and optional FAR and lot-coverage limits. The host
1129
+ * mints the envelope id and returns it. Canonical home of the create formerly
1130
+ * at `entity.buildableEnvelope.create` (now deprecated).
1131
+ *
1132
+ * @param sitePolygon - Site polygon vertices in `lengthUnit`; minimum 3 vertices.
1133
+ * @param lengthUnit - Unit used by all length fields (`"ft" | "m"`).
1134
+ * @param setbacks - Setback profile, ground tier first; minimum 1 tier.
1135
+ * @param verticalCap - Maximum height or floor count.
1136
+ * @param floorToFloor - Required floor-to-floor height in `lengthUnit`.
1137
+ * @param farRatio - Optional FAR value, positive when provided.
1138
+ * @param lotCoverageMaxPct - Optional lot coverage cap, `0..100`.
1139
+ * @returns A {@linkcode PluginBuildableEnvelopeCreateResult} with the
1140
+ * `buildableEnvelopeId` of the created envelope.
1141
+ * @throws If validation fails or generation produces no renderable geometry.
1142
+ *
1143
+ * @examplePrompt Create a buildable envelope for my site
1144
+ * @examplePrompt Generate the zoning envelope with 10ft front setbacks
1145
+ * @examplePrompt Show the maximum buildable volume with a 150ft height limit
1146
+ * @examplePrompt Create a zoning envelope capped at 12 floors with FAR 3
1147
+ *
1148
+ * # Example
1149
+ * ```ts
1150
+ * const { buildableEnvelopeId } = await snaptrude.design.create.buildableEnvelope(
1151
+ * [
1152
+ * { x: 0, z: 0 },
1153
+ * { x: 100, z: 0 },
1154
+ * { x: 100, z: 80 },
1155
+ * { x: 0, z: 80 },
1156
+ * ],
1157
+ * "ft",
1158
+ * [
1159
+ * { aboveHeight: 0, front: 10, side: 5, rear: 10 },
1160
+ * { aboveHeight: 100, front: 20, side: 10, rear: 20 },
1161
+ * ],
1162
+ * { kind: "max_height", maxHeight: 150 },
1163
+ * 12,
1164
+ * )
1165
+ * ```
1166
+ */
1167
+ abstract buildableEnvelope(sitePolygon: PluginBuildableEnvelopePolygonVertex[], lengthUnit: "ft" | "m", setbacks: PluginBuildableEnvelopeSetbackTier[], verticalCap: PluginBuildableEnvelopeVerticalCap, floorToFloor: number, farRatio?: number, lotCoverageMaxPct?: number): PluginApiReturn<PluginBuildableEnvelopeCreateResult>;
1168
+ }
1169
+ /**
1170
+ * Line style of a reference line (mirrors the engine `ReferenceLineMode` verbatim).
1171
+ *
1172
+ * | Value | Description |
1173
+ * |---|---|
1174
+ * | `"SOLID"` | Solid line (default) |
1175
+ * | `"DASHED"` | Dashed line |
1176
+ * | `"DOT_DASH"` | Dot-dash line |
1177
+ */
1178
+ export declare const PluginReferenceLineStyle: z.ZodEnum<{
1179
+ SOLID: "SOLID";
1180
+ DASHED: "DASHED";
1181
+ DOT_DASH: "DOT_DASH";
1182
+ }>;
1183
+ export type PluginReferenceLineStyle = z.infer<typeof PluginReferenceLineStyle>;
1184
+ /**
1185
+ * Slab type (mirrors the engine `SLAB_TYPES` values verbatim).
1186
+ *
1187
+ * | Value | Description |
1188
+ * |---|---|
1189
+ * | `"Intermediate Slab"` | Intermediate floor slab (default) |
1190
+ * | `"Basement Slab"` | Basement slab |
1191
+ * | `"Plinth"` | Plinth slab |
1192
+ * | `"Roof"` | Roof slab |
1193
+ */
1194
+ export declare const PluginSlabType: z.ZodEnum<{
1195
+ Plinth: "Plinth";
1196
+ "Intermediate Slab": "Intermediate Slab";
1197
+ "Basement Slab": "Basement Slab";
1198
+ Roof: "Roof";
1199
+ }>;
1200
+ export type PluginSlabType = z.infer<typeof PluginSlabType>;
1201
+ /**
1202
+ * A staircase preset — a base type or a named parametric preset. Mirrors the
1203
+ * engine `STAIRCASE_PRESETS` / `StaircaseType`. Use the value that matches the
1204
+ * shape you want (e.g. `"straight"`, `"dogLegged"`, `"lShaped"`).
1205
+ */
1206
+ export declare const PluginStaircasePreset: z.ZodEnum<{
1207
+ custom: "custom";
1208
+ straight: "straight";
1209
+ straightWoLanding: "straightWoLanding";
1210
+ straightFlightWoMidLanding: "straightFlightWoMidLanding";
1211
+ dogLegged: "dogLegged";
1212
+ openWell: "openWell";
1213
+ lShaped: "lShaped";
1214
+ "3StepLShaped": "3StepLShaped";
1215
+ square: "square";
1216
+ singleStep: "singleStep";
1217
+ plinthLevel: "plinthLevel";
1218
+ amphitheatre: "amphitheatre";
1219
+ connectingStepsToAmphitheatre: "connectingStepsToAmphitheatre";
1220
+ mezzanineFloorStraight: "mezzanineFloorStraight";
1221
+ mezzanineFloorDogLegged: "mezzanineFloorDogLegged";
1222
+ mezzanineFloorLShaped: "mezzanineFloorLShaped";
1223
+ }>;
1224
+ export type PluginStaircasePreset = z.infer<typeof PluginStaircasePreset>;
1225
+ /**
1226
+ * Optional staircase dimension overrides. Lengths use Snaptrude engine units
1227
+ * and must be positive. `angleInDegrees` controls placement about the vertical
1228
+ * axis and must be a multiple of 90 degrees.
1229
+ */
1230
+ export declare const PluginStaircaseDimensions: z.ZodObject<{
1231
+ width: z.ZodOptional<z.ZodNumber>;
1232
+ tread: z.ZodOptional<z.ZodNumber>;
1233
+ riser: z.ZodOptional<z.ZodNumber>;
1234
+ landingWidth: z.ZodOptional<z.ZodNumber>;
1235
+ angleInDegrees: z.ZodOptional<z.ZodNumber>;
1236
+ }, z.core.$strict>;
1237
+ export type PluginStaircaseDimensions = z.infer<typeof PluginStaircaseDimensions>;
1238
+ /**
1239
+ * Arguments for {@linkcode PluginDesignCreateApi.space}.
1240
+ *
1241
+ * | Property | Type | Description |
1242
+ * |---|---|---|
1243
+ * | `contour` | {@linkcode ContourHandle} | Bottom footprint (outer + holes) |
1244
+ * | `height` | `number` | Extrusion height (Snaptrude units, > 0) |
1245
+ * | `label` | `string`? | Room label (maps to the space's `room_type`) |
1246
+ * | `position` | {@linkcode Vec3Handle}? | Offset from origin (default origin) |
1247
+ * | `spaceType` | {@linkcode PluginSpaceType}? | Space-type classification (default `Room`) |
1248
+ * | `massType` | {@linkcode PluginMassType}? | Mass-type classification (default `Room`) |
1249
+ * | `departmentId` | {@linkcode PluginDepartmentId}? | Department assignment (default department) |
1250
+ * | `storey` | `number`? (int) | Target storey number (default active storey) |
1251
+ */
1252
+ export declare const PluginDesignCreateSpaceArgs: z.ZodObject<{
1253
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1254
+ height: z.ZodNumber;
1255
+ label: z.ZodOptional<z.ZodString>;
1256
+ position: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1257
+ spaceType: z.ZodOptional<z.ZodEnum<{
1258
+ Room: "Room";
1259
+ "Program Block": "Program Block";
1260
+ Balcony: "Balcony";
1261
+ Road: "Road";
1262
+ Garden: "Garden";
1263
+ Deck: "Deck";
1264
+ Pool: "Pool";
1265
+ Walkway: "Walkway";
1266
+ Envelope: "Envelope";
1267
+ Parking: "Parking";
1268
+ }>>;
1269
+ massType: z.ZodOptional<z.ZodEnum<{
1270
+ Room: "Room";
1271
+ Plinth: "Plinth";
1272
+ Void: "Void";
1273
+ Pergola: "Pergola";
1274
+ Furniture: "Furniture";
1275
+ "Facade element": "Facade element";
1276
+ "Generic mass": "Generic mass";
1277
+ Department: "Department";
1278
+ Building: "Building";
1279
+ "Revit Import": "Revit Import";
1280
+ Mass: "Mass";
1281
+ Site: "Site";
1282
+ }>>;
1283
+ departmentId: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1284
+ DEFAULT: "DEFAULT";
1285
+ SITE: "SITE";
1286
+ ENVELOPE: "ENVELOPE";
1287
+ CORE: "CORE";
1288
+ }>, z.ZodUUID]>>;
1289
+ storey: z.ZodOptional<z.ZodNumber>;
1290
+ }, z.core.$strip>;
1291
+ export type PluginDesignCreateSpaceArgs = z.infer<typeof PluginDesignCreateSpaceArgs>;
1292
+ /**
1293
+ * Arguments for {@linkcode PluginDesignCreateApi.mass}.
1294
+ *
1295
+ * | Property | Type | Description |
1296
+ * |---|---|---|
1297
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer + holes) |
1298
+ * | `height` | `number` | Extrusion height (> 0) |
1299
+ * | `label` | `string`? | Label (maps to `room_type`) |
1300
+ * | `position` | {@linkcode Vec3Handle}? | Offset from origin |
1301
+ * | `massType` | {@linkcode PluginMassType}? | Mass type (default `Generic mass`) |
1302
+ */
1303
+ export declare const PluginDesignCreateMassArgs: z.ZodObject<{
1304
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1305
+ height: z.ZodNumber;
1306
+ label: z.ZodOptional<z.ZodString>;
1307
+ position: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1308
+ massType: z.ZodOptional<z.ZodEnum<{
1309
+ Room: "Room";
1310
+ Plinth: "Plinth";
1311
+ Void: "Void";
1312
+ Pergola: "Pergola";
1313
+ Furniture: "Furniture";
1314
+ "Facade element": "Facade element";
1315
+ "Generic mass": "Generic mass";
1316
+ Department: "Department";
1317
+ Building: "Building";
1318
+ "Revit Import": "Revit Import";
1319
+ Mass: "Mass";
1320
+ Site: "Site";
1321
+ }>>;
1322
+ }, z.core.$strip>;
1323
+ export type PluginDesignCreateMassArgs = z.infer<typeof PluginDesignCreateMassArgs>;
1324
+ /**
1325
+ * Arguments for {@linkcode PluginDesignCreateApi.massFromBrep}.
1326
+ *
1327
+ * | Property | Type | Description |
1328
+ * |---|---|---|
1329
+ * | `brep` | {@linkcode BrepHandle} | A solid from a `core.geom.create` brep constructor |
1330
+ * | `label` | `string`? | Label (maps to `room_type`) |
1331
+ */
1332
+ export declare const PluginDesignCreateMassFromBrepArgs: z.ZodObject<{
1333
+ brep: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"brep">, string>>;
1334
+ label: z.ZodOptional<z.ZodString>;
1335
+ }, z.core.$strip>;
1336
+ export type PluginDesignCreateMassFromBrepArgs = z.infer<typeof PluginDesignCreateMassFromBrepArgs>;
1337
+ /**
1338
+ * Arguments for {@linkcode PluginDesignCreateApi.slab}.
1339
+ *
1340
+ * | Property | Type | Description |
1341
+ * |---|---|---|
1342
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer + holes) |
1343
+ * | `thickness` | `number` | Slab thickness (> 0) |
1344
+ * | `direction` | `"up" \| "down"`? | Extrusion direction (default `"down"`) |
1345
+ * | `slabType` | {@linkcode PluginSlabType}? | Slab-type classification |
1346
+ */
1347
+ export declare const PluginDesignCreateSlabArgs: z.ZodObject<{
1348
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1349
+ thickness: z.ZodNumber;
1350
+ direction: z.ZodOptional<z.ZodEnum<{
1351
+ up: "up";
1352
+ down: "down";
1353
+ }>>;
1354
+ slabType: z.ZodOptional<z.ZodEnum<{
1355
+ Plinth: "Plinth";
1356
+ "Intermediate Slab": "Intermediate Slab";
1357
+ "Basement Slab": "Basement Slab";
1358
+ Roof: "Roof";
1359
+ }>>;
1360
+ }, z.core.$strip>;
1361
+ export type PluginDesignCreateSlabArgs = z.infer<typeof PluginDesignCreateSlabArgs>;
1362
+ /**
1363
+ * Arguments for {@linkcode PluginDesignCreateApi.floor}.
1364
+ *
1365
+ * | Property | Type | Description |
1366
+ * |---|---|---|
1367
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer + holes) |
1368
+ * | `thickness` | `number` | Floor thickness (> 0) |
1369
+ * | `position` | {@linkcode Vec3Handle}? | Offset from origin |
1370
+ */
1371
+ export declare const PluginDesignCreateFloorArgs: z.ZodObject<{
1372
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1373
+ thickness: z.ZodNumber;
1374
+ position: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1375
+ }, z.core.$strip>;
1376
+ export type PluginDesignCreateFloorArgs = z.infer<typeof PluginDesignCreateFloorArgs>;
1377
+ /**
1378
+ * Arguments for {@linkcode PluginDesignCreateApi.roof}.
1379
+ *
1380
+ * | Property | Type | Description |
1381
+ * |---|---|---|
1382
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer + holes) |
1383
+ * | `thickness` | `number` | Roof-slab thickness (> 0) |
1384
+ */
1385
+ export declare const PluginDesignCreateRoofArgs: z.ZodObject<{
1386
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1387
+ thickness: z.ZodNumber;
1388
+ }, z.core.$strip>;
1389
+ export type PluginDesignCreateRoofArgs = z.infer<typeof PluginDesignCreateRoofArgs>;
1390
+ /**
1391
+ * Arguments for {@linkcode PluginDesignCreateApi.ceiling}.
1392
+ *
1393
+ * | Property | Type | Description |
1394
+ * |---|---|---|
1395
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer + holes) |
1396
+ * | `thickness` | `number` | Ceiling thickness (> 0) |
1397
+ * | `heightFromFloor` | `number`? | Lift above the floor (default 0) |
1398
+ */
1399
+ export declare const PluginDesignCreateCeilingArgs: z.ZodObject<{
1400
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1401
+ thickness: z.ZodNumber;
1402
+ heightFromFloor: z.ZodOptional<z.ZodNumber>;
1403
+ }, z.core.$strip>;
1404
+ export type PluginDesignCreateCeilingArgs = z.infer<typeof PluginDesignCreateCeilingArgs>;
1405
+ /**
1406
+ * Arguments for {@linkcode PluginDesignCreateApi.column}.
1407
+ *
1408
+ * | Property | Type | Description |
1409
+ * |---|---|---|
1410
+ * | `position` | {@linkcode Vec3Handle} | Base point |
1411
+ * | `crossSection` | {@linkcode ContourHandle} | Column cross-section footprint |
1412
+ * | `height` | `number` | Column height (> 0) |
1413
+ * | `directionUp` | {@linkcode Vec3Handle}? | Up axis (default world up) |
1414
+ */
1415
+ export declare const PluginDesignCreateColumnArgs: z.ZodObject<{
1416
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1417
+ crossSection: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1418
+ height: z.ZodNumber;
1419
+ directionUp: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1420
+ }, z.core.$strip>;
1421
+ export type PluginDesignCreateColumnArgs = z.infer<typeof PluginDesignCreateColumnArgs>;
1422
+ /**
1423
+ * Arguments for {@linkcode PluginDesignCreateApi.beam}.
1424
+ *
1425
+ * | Property | Type | Description |
1426
+ * |---|---|---|
1427
+ * | `section` | {@linkcode ContourHandle} | Beam cross-section footprint |
1428
+ * | `length` | `number` | Beam length along `direction` (> 0) |
1429
+ * | `direction` | {@linkcode Vec3Handle}? | Extrusion axis (default world up) |
1430
+ */
1431
+ export declare const PluginDesignCreateBeamArgs: z.ZodObject<{
1432
+ section: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1433
+ length: z.ZodNumber;
1434
+ direction: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1435
+ }, z.core.$strip>;
1436
+ export type PluginDesignCreateBeamArgs = z.infer<typeof PluginDesignCreateBeamArgs>;
1437
+ /**
1438
+ * Arguments for {@linkcode PluginDesignCreateApi.walls}.
1439
+ *
1440
+ * | Property | Type | Description |
1441
+ * |---|---|---|
1442
+ * | `profile` | {@linkcode ProfileHandle} | Ordered curve chain (wall centerlines) |
1443
+ * | `height` | `number`? | Wall height (default engine default) |
1444
+ * | `thickness` | `number`? | Wall thickness (default: `wallType`'s total layer thickness when given, else engine default) |
1445
+ * | `wallType` | `string`? | Wall type name from `design.types.list("wall")` — layers/material/thickness defaults (default generic) |
1446
+ * | `storey` | `number`? | Target storey (integer, must exist) — walls assigned + lifted to its base in the same undo entry (default: geometry-derived) |
1447
+ */
1448
+ export declare const PluginDesignCreateWallsArgs: z.ZodObject<{
1449
+ profile: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"profile">, string>>;
1450
+ height: z.ZodOptional<z.ZodNumber>;
1451
+ thickness: z.ZodOptional<z.ZodNumber>;
1452
+ wallType: z.ZodOptional<z.ZodString>;
1453
+ storey: z.ZodOptional<z.ZodNumber>;
1454
+ }, z.core.$strip>;
1455
+ export type PluginDesignCreateWallsArgs = z.infer<typeof PluginDesignCreateWallsArgs>;
1456
+ /**
1457
+ * Arguments for {@linkcode PluginDesignCreateApi.staircase}.
1458
+ *
1459
+ * | Property | Type | Description |
1460
+ * |---|---|---|
1461
+ * | `preset` | {@linkcode PluginStaircasePreset} | The parametric preset to generate |
1462
+ * | `position` | {@linkcode Vec3Handle} | Placement point |
1463
+ * | `label` | `string`? | Optional label |
1464
+ * | `structureId` | `string`? | Target structure (default active) |
1465
+ * | `level` | `string`? | Target level name (default active/`"01"`) |
1466
+ * | `dimensions` | {@linkcode PluginStaircaseDimensions}? | Positive dimension overrides in engine units, applied before creation |
1467
+ */
1468
+ export declare const PluginDesignCreateStaircaseArgs: z.ZodObject<{
1469
+ preset: z.ZodEnum<{
1470
+ custom: "custom";
1471
+ straight: "straight";
1472
+ straightWoLanding: "straightWoLanding";
1473
+ straightFlightWoMidLanding: "straightFlightWoMidLanding";
1474
+ dogLegged: "dogLegged";
1475
+ openWell: "openWell";
1476
+ lShaped: "lShaped";
1477
+ "3StepLShaped": "3StepLShaped";
1478
+ square: "square";
1479
+ singleStep: "singleStep";
1480
+ plinthLevel: "plinthLevel";
1481
+ amphitheatre: "amphitheatre";
1482
+ connectingStepsToAmphitheatre: "connectingStepsToAmphitheatre";
1483
+ mezzanineFloorStraight: "mezzanineFloorStraight";
1484
+ mezzanineFloorDogLegged: "mezzanineFloorDogLegged";
1485
+ mezzanineFloorLShaped: "mezzanineFloorLShaped";
1486
+ }>;
1487
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1488
+ label: z.ZodOptional<z.ZodString>;
1489
+ structureId: z.ZodOptional<z.ZodString>;
1490
+ level: z.ZodOptional<z.ZodString>;
1491
+ dimensions: z.ZodOptional<z.ZodObject<{
1492
+ width: z.ZodOptional<z.ZodNumber>;
1493
+ tread: z.ZodOptional<z.ZodNumber>;
1494
+ riser: z.ZodOptional<z.ZodNumber>;
1495
+ landingWidth: z.ZodOptional<z.ZodNumber>;
1496
+ angleInDegrees: z.ZodOptional<z.ZodNumber>;
1497
+ }, z.core.$strict>>;
1498
+ }, z.core.$strip>;
1499
+ export type PluginDesignCreateStaircaseArgs = z.infer<typeof PluginDesignCreateStaircaseArgs>;
1500
+ /**
1501
+ * Arguments for {@linkcode PluginDesignCreateApi.furniture}.
1502
+ *
1503
+ * | Property | Type | Description |
1504
+ * |---|---|---|
1505
+ * | `catalogId` | `string` | Library id: team `_id` or general `fullName` |
1506
+ * | `position` | {@linkcode Vec3Handle} | Absolute world placement point |
1507
+ * | `label` | `string`? | Instance name (default auto `${name}Ins${n}`) |
1508
+ * | `createNewSourceMesh` | `boolean`? | Legacy, kept for compatibility; the host records a catalog source exactly once and this flag cannot skip it |
1509
+ * | `angleInDegrees` | `number`? | Rotation about the vertical axis, in degrees (default unrotated) |
1510
+ */
1511
+ export declare const PluginDesignCreateFurnitureArgs: z.ZodObject<{
1512
+ catalogId: z.ZodString;
1513
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1514
+ label: z.ZodOptional<z.ZodString>;
1515
+ createNewSourceMesh: z.ZodOptional<z.ZodBoolean>;
1516
+ angleInDegrees: z.ZodOptional<z.ZodNumber>;
1517
+ }, z.core.$strip>;
1518
+ export type PluginDesignCreateFurnitureArgs = z.infer<typeof PluginDesignCreateFurnitureArgs>;
1519
+ /**
1520
+ * Arguments for {@linkcode PluginDesignCreateApi.door}.
1521
+ *
1522
+ * | Property | Type | Description |
1523
+ * |---|---|---|
1524
+ * | `catalogId` | `string` | Library id: team `_id` or general `fullName` |
1525
+ * | `hostWall` | {@linkcode ComponentHandle} | The wall to host the door |
1526
+ * | `position` | {@linkcode Vec3Handle} | World point projected onto the wall |
1527
+ * | `label` | `string`? | Instance name (optional) |
1528
+ * | `facing` | {@linkcode Vec3Handle}? | World point on the side of the wall the door swings open to (default engine-chosen) |
1529
+ * | `hinge` | {@linkcode Vec3Handle}? | World point near the jamb the door is hinged on (default the catalog item's authored side) |
1530
+ */
1531
+ export declare const PluginDesignCreateDoorArgs: z.ZodObject<{
1532
+ catalogId: z.ZodString;
1533
+ hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1534
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1535
+ label: z.ZodOptional<z.ZodString>;
1536
+ facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1537
+ hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1538
+ }, z.core.$strip>;
1539
+ export type PluginDesignCreateDoorArgs = z.infer<typeof PluginDesignCreateDoorArgs>;
1540
+ /**
1541
+ * Arguments for {@linkcode PluginDesignCreateApi.window}.
1542
+ *
1543
+ * | Property | Type | Description |
1544
+ * |---|---|---|
1545
+ * | `catalogId` | `string` | Library id: team `_id` or general `fullName` |
1546
+ * | `hostWall` | {@linkcode ComponentHandle} | The wall to host the window |
1547
+ * | `position` | {@linkcode Vec3Handle} | World point projected onto the wall |
1548
+ * | `label` | `string`? | Instance name (optional) |
1549
+ * | `facing` | {@linkcode Vec3Handle}? | World point on the side of the wall the window opens to (default engine-chosen) |
1550
+ * | `hinge` | {@linkcode Vec3Handle}? | World point near the jamb the window is hinged on (default the catalog item's authored side) |
1551
+ */
1552
+ export declare const PluginDesignCreateWindowArgs: z.ZodObject<{
1553
+ catalogId: z.ZodString;
1554
+ hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1555
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1556
+ label: z.ZodOptional<z.ZodString>;
1557
+ facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1558
+ hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1559
+ }, z.core.$strip>;
1560
+ export type PluginDesignCreateWindowArgs = z.infer<typeof PluginDesignCreateWindowArgs>;
1561
+ /**
1562
+ * Options for {@linkcode PluginDesignCreateApi.opening}, discriminated by
1563
+ * `kind`. Width and height are positive Snaptrude engine-unit values.
1564
+ * `sillHeight` is available only for windows, is nonnegative, and is precisely
1565
+ * the distance from the host wall base to the bottom of the window.
1566
+ */
1567
+ export declare const PluginDesignCreateOpeningOptions: z.ZodDiscriminatedUnion<[z.ZodObject<{
1568
+ catalogId: z.ZodString;
1569
+ hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1570
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1571
+ facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1572
+ hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1573
+ label: z.ZodOptional<z.ZodString>;
1574
+ width: z.ZodOptional<z.ZodNumber>;
1575
+ height: z.ZodOptional<z.ZodNumber>;
1576
+ kind: z.ZodLiteral<"door">;
1577
+ }, z.core.$strict>, z.ZodObject<{
1578
+ sillHeight: z.ZodOptional<z.ZodNumber>;
1579
+ catalogId: z.ZodString;
1580
+ hostWall: z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>;
1581
+ position: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1582
+ facing: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1583
+ hinge: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1584
+ label: z.ZodOptional<z.ZodString>;
1585
+ width: z.ZodOptional<z.ZodNumber>;
1586
+ height: z.ZodOptional<z.ZodNumber>;
1587
+ kind: z.ZodLiteral<"window">;
1588
+ }, z.core.$strict>], "kind">;
1589
+ export type PluginDesignCreateOpeningOptions = z.infer<typeof PluginDesignCreateOpeningOptions>;
1590
+ /**
1591
+ * Arguments for {@linkcode PluginDesignCreateApi.smartLayout}. Provide **exactly
1592
+ * one** template source: `templateGroup` or a non-empty `templateComponents`.
1593
+ *
1594
+ * | Property | Type | Description |
1595
+ * |---|---|---|
1596
+ * | `templateGroup` | `string`? | Id of the group to clone as the template (a group id from `snaptrude.core.groups.list`, NOT a component handle) |
1597
+ * | `templateComponents` | {@linkcode ComponentHandle}`[]`? | Explicit component set to clone as the template |
1598
+ * | `targets` | {@linkcode ComponentHandle}`[]` | ROOM/DEPARTMENT spaces to place into (≥1) |
1599
+ * | `hideTargets` | `boolean`? | Hide the target spaces after placement (default `true`) |
1600
+ */
1601
+ export declare const PluginSmartLayoutArgs: z.ZodObject<{
1602
+ templateGroup: z.ZodOptional<z.ZodString>;
1603
+ templateComponents: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>>;
1604
+ targets: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1605
+ hideTargets: z.ZodOptional<z.ZodBoolean>;
1606
+ }, z.core.$strip>;
1607
+ export type PluginSmartLayoutArgs = z.infer<typeof PluginSmartLayoutArgs>;
1608
+ /**
1609
+ * Result of {@linkcode PluginDesignCreateApi.smartLayout} — the entities the run
1610
+ * created, grouped by kind (flat across all targets; see the method JSDoc for why
1611
+ * this is not attributed per target).
1612
+ *
1613
+ * | Property | Type | Description |
1614
+ * |---|---|---|
1615
+ * | `created.walls` | {@linkcode ComponentHandle}`[]` | Created walls |
1616
+ * | `created.furniture` | {@linkcode ComponentHandle}`[]` | Created furniture |
1617
+ * | `created.doors` | {@linkcode ComponentHandle}`[]` | Created doors |
1618
+ * | `created.windows` | {@linkcode ComponentHandle}`[]` | Created windows |
1619
+ * | `created.floors` | {@linkcode ComponentHandle}`[]` | Created floors |
1620
+ * | `skippedWalls` | `number` | Walls the interior optimizer could not place |
1621
+ */
1622
+ export declare const PluginSmartLayoutResult: z.ZodObject<{
1623
+ created: z.ZodObject<{
1624
+ walls: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1625
+ furniture: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1626
+ doors: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1627
+ windows: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1628
+ floors: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1629
+ }, z.core.$strip>;
1630
+ skippedWalls: z.ZodNumber;
1631
+ }, z.core.$strip>;
1632
+ export type PluginSmartLayoutResult = z.infer<typeof PluginSmartLayoutResult>;
1633
+ /**
1634
+ * Arguments for {@linkcode PluginDesignCreateApi.referenceLines}.
1635
+ *
1636
+ * | Property | Type | Description |
1637
+ * |---|---|---|
1638
+ * | `profile` | {@linkcode ProfileHandle} | Ordered curve chain (centerlines) |
1639
+ * | `color` | `string`? | Hex color `"#RRGGBB"` (default white) |
1640
+ * | `thickness` | `number`? | Line thickness (default 1) |
1641
+ * | `style` | {@linkcode PluginReferenceLineStyle}? | Line style (default `SOLID`) |
1642
+ * | `gridTag` | `string`? | Grid tag label (default `"A"`) |
1643
+ */
1644
+ export declare const PluginDesignCreateReferenceLinesArgs: z.ZodObject<{
1645
+ profile: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"profile">, string>>;
1646
+ color: z.ZodOptional<z.ZodString>;
1647
+ thickness: z.ZodOptional<z.ZodNumber>;
1648
+ style: z.ZodOptional<z.ZodEnum<{
1649
+ SOLID: "SOLID";
1650
+ DASHED: "DASHED";
1651
+ DOT_DASH: "DOT_DASH";
1652
+ }>>;
1653
+ gridTag: z.ZodOptional<z.ZodString>;
1654
+ }, z.core.$strip>;
1655
+ export type PluginDesignCreateReferenceLinesArgs = z.infer<typeof PluginDesignCreateReferenceLinesArgs>;
1656
+ /**
1657
+ * Copy mode for {@linkcode PluginDesignCreateApi.copy}.
1658
+ *
1659
+ * | Value | Description |
1660
+ * |---|---|
1661
+ * | `"instance"` | Keep copies in the source's instance family where possible |
1662
+ * | `"unique"` | Independent geometry copies |
1663
+ */
1664
+ export declare const PluginCopyMode: z.ZodEnum<{
1665
+ unique: "unique";
1666
+ instance: "instance";
1667
+ }>;
1668
+ export type PluginCopyMode = z.infer<typeof PluginCopyMode>;
1669
+ /**
1670
+ * Arguments for {@linkcode PluginDesignCreateApi.copy} (options flattened).
1671
+ *
1672
+ * | Property | Type | Description |
1673
+ * |---|---|---|
1674
+ * | `components` | {@linkcode ComponentHandle}`[]` | Entities to copy (≥1) |
1675
+ * | `displacement` | {@linkcode Vec3Handle} | Per-copy offset (copy `i` at `displacement * i`) |
1676
+ * | `count` | `number`? | Copies per component (default 1) |
1677
+ * | `mode` | {@linkcode PluginCopyMode}? | `"instance"` (default) or `"unique"` |
1678
+ */
1679
+ export declare const PluginDesignCreateCopyArgs: z.ZodObject<{
1680
+ components: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<ComponentHandle, string>>>;
1681
+ displacement: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>;
1682
+ count: z.ZodOptional<z.ZodNumber>;
1683
+ mode: z.ZodOptional<z.ZodEnum<{
1684
+ unique: "unique";
1685
+ instance: "instance";
1686
+ }>>;
1687
+ }, z.core.$strip>;
1688
+ export type PluginDesignCreateCopyArgs = z.infer<typeof PluginDesignCreateCopyArgs>;
1689
+ /**
1690
+ * One space to create via {@linkcode PluginDesignCreateApi.spaces} — the same
1691
+ * footprint-extrude inputs as {@linkcode PluginDesignCreateApi.space}.
1692
+ *
1693
+ * | Property | Type | Description |
1694
+ * |---|---|---|
1695
+ * | `contour` | {@linkcode ContourHandle} | Footprint (outer profile + holes) |
1696
+ * | `height` | `number` | Extrude height |
1697
+ * | `label` | `string`? | Room label |
1698
+ * | `position` | {@linkcode Vec3Handle}? | Placement offset |
1699
+ * | `spaceType` | `PluginSpaceType`? | Space type |
1700
+ * | `massType` | `PluginMassType`? | Mass type |
1701
+ * | `departmentId` | `PluginDepartmentId`? | Department |
1702
+ * | `storey` | `number`? (int) | Target storey number (default active storey) |
1703
+ */
1704
+ export declare const PluginCreateSpaceItem: z.ZodObject<{
1705
+ contour: z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"contour">, string>>;
1706
+ height: z.ZodNumber;
1707
+ label: z.ZodOptional<z.ZodString>;
1708
+ position: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodString>, z.ZodTransform<import("../../..").Handle<"vec3">, string>>>;
1709
+ spaceType: z.ZodOptional<z.ZodEnum<{
1710
+ Room: "Room";
1711
+ "Program Block": "Program Block";
1712
+ Balcony: "Balcony";
1713
+ Road: "Road";
1714
+ Garden: "Garden";
1715
+ Deck: "Deck";
1716
+ Pool: "Pool";
1717
+ Walkway: "Walkway";
1718
+ Envelope: "Envelope";
1719
+ Parking: "Parking";
1720
+ }>>;
1721
+ massType: z.ZodOptional<z.ZodEnum<{
1722
+ Room: "Room";
1723
+ Plinth: "Plinth";
1724
+ Void: "Void";
1725
+ Pergola: "Pergola";
1726
+ Furniture: "Furniture";
1727
+ "Facade element": "Facade element";
1728
+ "Generic mass": "Generic mass";
1729
+ Department: "Department";
1730
+ Building: "Building";
1731
+ "Revit Import": "Revit Import";
1732
+ Mass: "Mass";
1733
+ Site: "Site";
1734
+ }>>;
1735
+ departmentId: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1736
+ DEFAULT: "DEFAULT";
1737
+ SITE: "SITE";
1738
+ ENVELOPE: "ENVELOPE";
1739
+ CORE: "CORE";
1740
+ }>, z.ZodUUID]>>;
1741
+ storey: z.ZodOptional<z.ZodNumber>;
1742
+ }, z.core.$strip>;
1743
+ export type PluginCreateSpaceItem = z.infer<typeof PluginCreateSpaceItem>;
1744
+ export * from "./opening-fields";
1745
+ export * from "./bulk-items";
1746
+ export * from "./grids";
1747
+ //# sourceMappingURL=index.d.ts.map