@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.
- package/AGENTS.md +231 -0
- package/CHANGELOG.md +341 -0
- package/CLAUDE.md +11 -0
- package/api-manifest.json +9120 -0
- package/dist/api/analysis/daylight.d.ts +603 -0
- package/dist/api/analysis/daylight.d.ts.map +1 -0
- package/dist/api/analysis/heatmaps.d.ts +658 -0
- package/dist/api/analysis/heatmaps.d.ts.map +1 -0
- package/dist/api/analysis/illuminance.d.ts +145 -0
- package/dist/api/analysis/illuminance.d.ts.map +1 -0
- package/dist/api/analysis/index.d.ts +59 -0
- package/dist/api/analysis/index.d.ts.map +1 -0
- package/dist/api/analysis/shadows.d.ts +165 -0
- package/dist/api/analysis/shadows.d.ts.map +1 -0
- package/dist/api/analysis/solar.d.ts +249 -0
- package/dist/api/analysis/solar.d.ts.map +1 -0
- package/dist/api/analysis/sunlightHours.d.ts +208 -0
- package/dist/api/analysis/sunlightHours.d.ts.map +1 -0
- package/dist/api/analysis/sunpath.d.ts +80 -0
- package/dist/api/analysis/sunpath.d.ts.map +1 -0
- package/dist/api/analysis/weather.d.ts +193 -0
- package/dist/api/analysis/weather.d.ts.map +1 -0
- package/dist/api/core/buildings.d.ts +427 -0
- package/dist/api/core/buildings.d.ts.map +1 -0
- package/dist/api/core/camera/index.d.ts +261 -0
- package/dist/api/core/camera/index.d.ts.map +1 -0
- package/dist/api/core/comment/index.d.ts +333 -0
- package/dist/api/core/comment/index.d.ts.map +1 -0
- package/dist/api/core/geom/create/index.d.ts +1073 -0
- package/dist/api/core/geom/create/index.d.ts.map +1 -0
- package/dist/api/core/geom/delete/index.d.ts +78 -0
- package/dist/api/core/geom/delete/index.d.ts.map +1 -0
- package/dist/api/core/geom/index.d.ts +33 -0
- package/dist/api/core/geom/index.d.ts.map +1 -0
- package/dist/api/core/geom/query/arc.d.ts +169 -0
- package/dist/api/core/geom/query/arc.d.ts.map +1 -0
- package/dist/api/core/geom/query/brep.d.ts +514 -0
- package/dist/api/core/geom/query/brep.d.ts.map +1 -0
- package/dist/api/core/geom/query/circle.d.ts +378 -0
- package/dist/api/core/geom/query/circle.d.ts.map +1 -0
- package/dist/api/core/geom/query/contour.d.ts +450 -0
- package/dist/api/core/geom/query/contour.d.ts.map +1 -0
- package/dist/api/core/geom/query/curve.d.ts +918 -0
- package/dist/api/core/geom/query/curve.d.ts.map +1 -0
- package/dist/api/core/geom/query/edge.d.ts +128 -0
- package/dist/api/core/geom/query/edge.d.ts.map +1 -0
- package/dist/api/core/geom/query/face.d.ts +363 -0
- package/dist/api/core/geom/query/face.d.ts.map +1 -0
- package/dist/api/core/geom/query/halfedge.d.ts +206 -0
- package/dist/api/core/geom/query/halfedge.d.ts.map +1 -0
- package/dist/api/core/geom/query/index.d.ts +61 -0
- package/dist/api/core/geom/query/index.d.ts.map +1 -0
- package/dist/api/core/geom/query/profile.d.ts +410 -0
- package/dist/api/core/geom/query/profile.d.ts.map +1 -0
- package/dist/api/core/geom/query/vertex.d.ts +187 -0
- package/dist/api/core/geom/query/vertex.d.ts.map +1 -0
- package/dist/api/core/geom/update/contour.d.ts +272 -0
- package/dist/api/core/geom/update/contour.d.ts.map +1 -0
- package/dist/api/core/geom/update/curve.d.ts +180 -0
- package/dist/api/core/geom/update/curve.d.ts.map +1 -0
- package/dist/api/core/geom/update/index.d.ts +27 -0
- package/dist/api/core/geom/update/index.d.ts.map +1 -0
- package/dist/api/core/geom/update/profile.d.ts +329 -0
- package/dist/api/core/geom/update/profile.d.ts.map +1 -0
- package/dist/api/core/groups.d.ts +485 -0
- package/dist/api/core/groups.d.ts.map +1 -0
- package/dist/api/core/handles/index.d.ts +210 -0
- package/dist/api/core/handles/index.d.ts.map +1 -0
- package/dist/api/core/history/index.d.ts +78 -0
- package/dist/api/core/history/index.d.ts.map +1 -0
- package/dist/api/core/index.d.ts +97 -0
- package/dist/api/core/index.d.ts.map +1 -0
- package/dist/api/core/io/export/index.d.ts +134 -0
- package/dist/api/core/io/export/index.d.ts.map +1 -0
- package/dist/api/core/io/import/index.d.ts +455 -0
- package/dist/api/core/io/import/index.d.ts.map +1 -0
- package/dist/api/core/io/index.d.ts +40 -0
- package/dist/api/core/io/index.d.ts.map +1 -0
- package/dist/api/core/io/job/index.d.ts +139 -0
- package/dist/api/core/io/job/index.d.ts.map +1 -0
- package/dist/api/core/io/query/index.d.ts +74 -0
- package/dist/api/core/io/query/index.d.ts.map +1 -0
- package/dist/api/core/io/terrain/index.d.ts +341 -0
- package/dist/api/core/io/terrain/index.d.ts.map +1 -0
- package/dist/api/core/io/underlay/index.d.ts +805 -0
- package/dist/api/core/io/underlay/index.d.ts.map +1 -0
- package/dist/api/core/layers.d.ts +402 -0
- package/dist/api/core/layers.d.ts.map +1 -0
- package/dist/api/core/math/index.d.ts +18 -0
- package/dist/api/core/math/index.d.ts.map +1 -0
- package/dist/api/core/math/quat.d.ts +170 -0
- package/dist/api/core/math/quat.d.ts.map +1 -0
- package/dist/api/core/math/vec3.d.ts +174 -0
- package/dist/api/core/math/vec3.d.ts.map +1 -0
- package/dist/api/core/mode/index.d.ts +111 -0
- package/dist/api/core/mode/index.d.ts.map +1 -0
- package/dist/api/core/project/index.d.ts +466 -0
- package/dist/api/core/project/index.d.ts.map +1 -0
- package/dist/api/core/proposals/index.d.ts +531 -0
- package/dist/api/core/proposals/index.d.ts.map +1 -0
- package/dist/api/core/storeys/index.d.ts +265 -0
- package/dist/api/core/storeys/index.d.ts.map +1 -0
- package/dist/api/core/tags.d.ts +860 -0
- package/dist/api/core/tags.d.ts.map +1 -0
- package/dist/api/core/units/index.d.ts +175 -0
- package/dist/api/core/units/index.d.ts.map +1 -0
- package/dist/api/core/user.d.ts +44 -0
- package/dist/api/core/user.d.ts.map +1 -0
- package/dist/api/core/zoom/index.d.ts +49 -0
- package/dist/api/core/zoom/index.d.ts.map +1 -0
- package/dist/api/design/boolean/index.d.ts +168 -0
- package/dist/api/design/boolean/index.d.ts.map +1 -0
- package/dist/api/design/create/bulk-items.d.ts +185 -0
- package/dist/api/design/create/bulk-items.d.ts.map +1 -0
- package/dist/api/design/create/grids.d.ts +132 -0
- package/dist/api/design/create/grids.d.ts.map +1 -0
- package/dist/api/design/create/index.d.ts +1747 -0
- package/dist/api/design/create/index.d.ts.map +1 -0
- package/dist/api/design/create/opening-fields.d.ts +37 -0
- package/dist/api/design/create/opening-fields.d.ts.map +1 -0
- package/dist/api/design/delete/index.d.ts +70 -0
- package/dist/api/design/delete/index.d.ts.map +1 -0
- package/dist/api/design/dimensions.d.ts +427 -0
- package/dist/api/design/dimensions.d.ts.map +1 -0
- package/dist/api/design/doors/index.d.ts +470 -0
- package/dist/api/design/doors/index.d.ts.map +1 -0
- package/dist/api/design/edit/index.d.ts +49 -0
- package/dist/api/design/edit/index.d.ts.map +1 -0
- package/dist/api/design/erase/index.d.ts +160 -0
- package/dist/api/design/erase/index.d.ts.map +1 -0
- package/dist/api/design/family.d.ts +611 -0
- package/dist/api/design/family.d.ts.map +1 -0
- package/dist/api/design/furniture/index.d.ts +296 -0
- package/dist/api/design/furniture/index.d.ts.map +1 -0
- package/dist/api/design/grids.d.ts +237 -0
- package/dist/api/design/grids.d.ts.map +1 -0
- package/dist/api/design/index.d.ts +260 -0
- package/dist/api/design/index.d.ts.map +1 -0
- package/dist/api/design/lock.d.ts +67 -0
- package/dist/api/design/lock.d.ts.map +1 -0
- package/dist/api/design/materials/index.d.ts +551 -0
- package/dist/api/design/materials/index.d.ts.map +1 -0
- package/dist/api/design/query/geometry/index.d.ts +252 -0
- package/dist/api/design/query/geometry/index.d.ts.map +1 -0
- package/dist/api/design/query/grids.d.ts +287 -0
- package/dist/api/design/query/grids.d.ts.map +1 -0
- package/dist/api/design/query/index.d.ts +1318 -0
- package/dist/api/design/query/index.d.ts.map +1 -0
- package/dist/api/design/query/referenceLines.d.ts +45 -0
- package/dist/api/design/query/referenceLines.d.ts.map +1 -0
- package/dist/api/design/query/spaces.d.ts +394 -0
- package/dist/api/design/query/spaces.d.ts.map +1 -0
- package/dist/api/design/selection/index.d.ts +282 -0
- package/dist/api/design/selection/index.d.ts.map +1 -0
- package/dist/api/design/shared.d.ts +38 -0
- package/dist/api/design/shared.d.ts.map +1 -0
- package/dist/api/design/transform/index.d.ts +249 -0
- package/dist/api/design/transform/index.d.ts.map +1 -0
- package/dist/api/design/types/index.d.ts +181 -0
- package/dist/api/design/types/index.d.ts.map +1 -0
- package/dist/api/design/update/index.d.ts +803 -0
- package/dist/api/design/update/index.d.ts.map +1 -0
- package/dist/api/design/visibility.d.ts +126 -0
- package/dist/api/design/visibility.d.ts.map +1 -0
- package/dist/api/design/windows/index.d.ts +300 -0
- package/dist/api/design/windows/index.d.ts.map +1 -0
- package/dist/api/entity/buildableEnvelope.d.ts +265 -0
- package/dist/api/entity/buildableEnvelope.d.ts.map +1 -0
- package/dist/api/entity/department.d.ts +1 -0
- package/dist/api/entity/department.d.ts.map +1 -0
- package/dist/api/entity/index.d.ts +28 -0
- package/dist/api/entity/index.d.ts.map +1 -0
- package/dist/api/entity/referenceLine.d.ts +210 -0
- package/dist/api/entity/referenceLine.d.ts.map +1 -0
- package/dist/api/entity/space.d.ts +846 -0
- package/dist/api/entity/space.d.ts.map +1 -0
- package/dist/api/entity/story.d.ts +476 -0
- package/dist/api/entity/story.d.ts.map +1 -0
- package/dist/api/index.d.ts +45 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/presentation/aiInspiration.d.ts +2400 -0
- package/dist/api/presentation/aiInspiration.d.ts.map +1 -0
- package/dist/api/presentation/annotate.d.ts +483 -0
- package/dist/api/presentation/annotate.d.ts.map +1 -0
- package/dist/api/presentation/diagrams.d.ts +184 -0
- package/dist/api/presentation/diagrams.d.ts.map +1 -0
- package/dist/api/presentation/drawings.d.ts +2900 -0
- package/dist/api/presentation/drawings.d.ts.map +1 -0
- package/dist/api/presentation/export.d.ts +126 -0
- package/dist/api/presentation/export.d.ts.map +1 -0
- package/dist/api/presentation/import.d.ts +164 -0
- package/dist/api/presentation/import.d.ts.map +1 -0
- package/dist/api/presentation/index.d.ts +114 -0
- package/dist/api/presentation/index.d.ts.map +1 -0
- package/dist/api/presentation/placedViews.d.ts +1232 -0
- package/dist/api/presentation/placedViews.d.ts.map +1 -0
- package/dist/api/presentation/shapes.d.ts +481 -0
- package/dist/api/presentation/shapes.d.ts.map +1 -0
- package/dist/api/presentation/sheets.d.ts +643 -0
- package/dist/api/presentation/sheets.d.ts.map +1 -0
- package/dist/api/presentation/slideshow.d.ts +125 -0
- package/dist/api/presentation/slideshow.d.ts.map +1 -0
- package/dist/api/presentation/tables.d.ts +81 -0
- package/dist/api/presentation/tables.d.ts.map +1 -0
- package/dist/api/presentation/viewPresets.d.ts +70 -0
- package/dist/api/presentation/viewPresets.d.ts.map +1 -0
- package/dist/api/presentation/views.d.ts +741 -0
- package/dist/api/presentation/views.d.ts.map +1 -0
- package/dist/api/program/adjacency.d.ts +155 -0
- package/dist/api/program/adjacency.d.ts.map +1 -0
- package/dist/api/program/areas.d.ts +450 -0
- package/dist/api/program/areas.d.ts.map +1 -0
- package/dist/api/program/classification.d.ts +135 -0
- package/dist/api/program/classification.d.ts.map +1 -0
- package/dist/api/program/cores.d.ts +78 -0
- package/dist/api/program/cores.d.ts.map +1 -0
- package/dist/api/program/departments.d.ts +487 -0
- package/dist/api/program/departments.d.ts.map +1 -0
- package/dist/api/program/index.d.ts +71 -0
- package/dist/api/program/index.d.ts.map +1 -0
- package/dist/api/program/labels.d.ts +355 -0
- package/dist/api/program/labels.d.ts.map +1 -0
- package/dist/api/program/layout.d.ts +398 -0
- package/dist/api/program/layout.d.ts.map +1 -0
- package/dist/api/program/metadata.d.ts +328 -0
- package/dist/api/program/metadata.d.ts.map +1 -0
- package/dist/api/program/metrics.d.ts +108 -0
- package/dist/api/program/metrics.d.ts.map +1 -0
- package/dist/api/program/site.d.ts +823 -0
- package/dist/api/program/site.d.ts.map +1 -0
- package/dist/api/program/spreadsheet.d.ts +2628 -0
- package/dist/api/program/spreadsheet.d.ts.map +1 -0
- package/dist/api/workspace/index.d.ts +552 -0
- package/dist/api/workspace/index.d.ts.map +1 -0
- package/dist/errors/codes.d.ts +34 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/envelope.d.ts +56 -0
- package/dist/errors/envelope.d.ts.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/plugin-error.d.ts +69 -0
- package/dist/errors/plugin-error.d.ts.map +1 -0
- package/dist/handles.d.ts +229 -0
- package/dist/handles.d.ts.map +1 -0
- package/dist/host-utils.d.ts +47 -0
- package/dist/host-utils.d.ts.map +1 -0
- package/dist/index.cjs +8836 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7568 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +41 -0
- package/scripts/generate-manifest.mjs +238 -0
- package/scripts/generate-manifest.test.mjs +292 -0
- package/src/api/analysis/daylight.ts +470 -0
- package/src/api/analysis/heatmaps.ts +683 -0
- package/src/api/analysis/illuminance.ts +155 -0
- package/src/api/analysis/index.ts +61 -0
- package/src/api/analysis/shadows.ts +183 -0
- package/src/api/analysis/solar.ts +237 -0
- package/src/api/analysis/sunlightHours.ts +211 -0
- package/src/api/analysis/sunpath.ts +83 -0
- package/src/api/analysis/weather.ts +179 -0
- package/src/api/core/buildings.ts +485 -0
- package/src/api/core/camera/index.ts +268 -0
- package/src/api/core/comment/index.ts +376 -0
- package/src/api/core/geom/create/index.ts +1204 -0
- package/src/api/core/geom/delete/index.ts +84 -0
- package/src/api/core/geom/index.ts +35 -0
- package/src/api/core/geom/query/arc.ts +169 -0
- package/src/api/core/geom/query/brep.ts +563 -0
- package/src/api/core/geom/query/circle.ts +404 -0
- package/src/api/core/geom/query/contour.ts +540 -0
- package/src/api/core/geom/query/curve.ts +1078 -0
- package/src/api/core/geom/query/edge.ts +130 -0
- package/src/api/core/geom/query/face.ts +403 -0
- package/src/api/core/geom/query/halfedge.ts +210 -0
- package/src/api/core/geom/query/index.ts +63 -0
- package/src/api/core/geom/query/profile.ts +473 -0
- package/src/api/core/geom/query/vertex.ts +205 -0
- package/src/api/core/geom/update/contour.ts +315 -0
- package/src/api/core/geom/update/curve.ts +209 -0
- package/src/api/core/geom/update/index.ts +29 -0
- package/src/api/core/geom/update/profile.ts +377 -0
- package/src/api/core/groups.ts +521 -0
- package/src/api/core/handles/index.ts +233 -0
- package/src/api/core/history/index.ts +84 -0
- package/src/api/core/index.ts +99 -0
- package/src/api/core/io/export/index.ts +126 -0
- package/src/api/core/io/import/index.ts +504 -0
- package/src/api/core/io/index.ts +42 -0
- package/src/api/core/io/job/index.ts +140 -0
- package/src/api/core/io/query/index.ts +71 -0
- package/src/api/core/io/terrain/index.ts +360 -0
- package/src/api/core/io/underlay/index.ts +705 -0
- package/src/api/core/layers.ts +333 -0
- package/src/api/core/math/index.ts +20 -0
- package/src/api/core/math/quat.ts +172 -0
- package/src/api/core/math/vec3.ts +179 -0
- package/src/api/core/mode/index.ts +108 -0
- package/src/api/core/project/index.ts +479 -0
- package/src/api/core/proposals/index.ts +569 -0
- package/src/api/core/storeys/index.ts +294 -0
- package/src/api/core/tags.ts +911 -0
- package/src/api/core/units/index.ts +164 -0
- package/src/api/core/user.ts +46 -0
- package/src/api/core/zoom/index.ts +51 -0
- package/src/api/design/boolean/index.ts +179 -0
- package/src/api/design/create/bulk-items.ts +186 -0
- package/src/api/design/create/grids.ts +137 -0
- package/src/api/design/create/index.ts +1954 -0
- package/src/api/design/create/opening-fields.ts +37 -0
- package/src/api/design/delete/index.ts +74 -0
- package/src/api/design/dimensions.ts +453 -0
- package/src/api/design/doors/index.ts +500 -0
- package/src/api/design/edit/index.ts +54 -0
- package/src/api/design/erase/index.ts +151 -0
- package/src/api/design/family.ts +646 -0
- package/src/api/design/furniture/index.ts +319 -0
- package/src/api/design/grids.ts +237 -0
- package/src/api/design/index.ts +274 -0
- package/src/api/design/lock.ts +69 -0
- package/src/api/design/materials/index.ts +608 -0
- package/src/api/design/query/geometry/index.ts +288 -0
- package/src/api/design/query/grids.ts +197 -0
- package/src/api/design/query/index.ts +1176 -0
- package/src/api/design/query/referenceLines.ts +52 -0
- package/src/api/design/query/spaces.ts +275 -0
- package/src/api/design/selection/index.ts +273 -0
- package/src/api/design/shared.ts +40 -0
- package/src/api/design/transform/index.ts +254 -0
- package/src/api/design/types/index.ts +156 -0
- package/src/api/design/update/index.ts +798 -0
- package/src/api/design/visibility.ts +143 -0
- package/src/api/design/windows/index.ts +333 -0
- package/src/api/entity/buildableEnvelope.ts +322 -0
- package/src/api/entity/department.ts +0 -0
- package/src/api/entity/index.ts +30 -0
- package/src/api/entity/referenceLine.ts +235 -0
- package/src/api/entity/space.ts +612 -0
- package/src/api/entity/story.ts +517 -0
- package/src/api/index.ts +47 -0
- package/src/api/presentation/aiInspiration.ts +1116 -0
- package/src/api/presentation/annotate.ts +417 -0
- package/src/api/presentation/diagrams.ts +194 -0
- package/src/api/presentation/drawings.ts +529 -0
- package/src/api/presentation/export.ts +133 -0
- package/src/api/presentation/import.ts +159 -0
- package/src/api/presentation/index.ts +129 -0
- package/src/api/presentation/placedViews.ts +1203 -0
- package/src/api/presentation/shapes.ts +274 -0
- package/src/api/presentation/sheets.ts +616 -0
- package/src/api/presentation/slideshow.ts +134 -0
- package/src/api/presentation/tables.ts +84 -0
- package/src/api/presentation/viewPresets.ts +83 -0
- package/src/api/presentation/views.ts +698 -0
- package/src/api/program/adjacency.ts +164 -0
- package/src/api/program/areas.ts +408 -0
- package/src/api/program/classification.ts +138 -0
- package/src/api/program/cores.ts +83 -0
- package/src/api/program/departments.ts +517 -0
- package/src/api/program/index.ts +73 -0
- package/src/api/program/labels.ts +332 -0
- package/src/api/program/layout.ts +422 -0
- package/src/api/program/metadata.ts +364 -0
- package/src/api/program/metrics.ts +120 -0
- package/src/api/program/site.ts +748 -0
- package/src/api/program/spreadsheet.ts +2698 -0
- package/src/api/workspace/index.ts +612 -0
- package/src/errors/codes.ts +136 -0
- package/src/errors/envelope.ts +75 -0
- package/src/errors/index.ts +21 -0
- package/src/errors/plugin-error.ts +134 -0
- package/src/handles.ts +282 -0
- package/src/host-utils.ts +68 -0
- package/src/index.ts +5 -0
- package/src/types.ts +16 -0
- package/test/errors.test.mjs +184 -0
- package/tsconfig.json +22 -0
- package/tsup.config.ts +12 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../../types"
|
|
3
|
+
import { ComponentHandle } from "../../../handles"
|
|
4
|
+
import { PluginDesignChangeResult } from "../lock"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* `snaptrude.design.doors` — door-specific reads + edits. Creation lives at
|
|
8
|
+
* `design.create.door`; generic reads (`listDoors`/`getHost`/`getProperties`) live at
|
|
9
|
+
* `design.query.*`. Door targets are {@linkcode ComponentHandle}s.
|
|
10
|
+
*
|
|
11
|
+
* `getSwingDirection` is a DERIVED read (no persisted field) — computed from the placed
|
|
12
|
+
* mesh's orientation: stand on the side the door swings open to, facing it; `'left'`
|
|
13
|
+
* when the hinged jamb is on your left. `mirror` reflects the door about one of its own
|
|
14
|
+
* axes (undoable, one command): `'x'` flips the swing side, `'z'` swaps the hinged jamb;
|
|
15
|
+
* `setType` is intentionally absent (the engine has no in-place re-type —
|
|
16
|
+
* it would require delete+recreate).
|
|
17
|
+
*
|
|
18
|
+
* The **catalog** reads (`listCatalogGroups`/`listCatalog`/`getCatalogItem`/`exists`)
|
|
19
|
+
* browse the placeable door library — plain value records keyed by a library id
|
|
20
|
+
* (team `_id` or general `fullName`), NOT handles — and feed `design.create.door`.
|
|
21
|
+
* They are network-backed but carry no `Async` suffix (§6.6) and never throw
|
|
22
|
+
* (`[]`/`null`). The {@linkcode PluginObjectCatalogGroup} / {@linkcode PluginObjectCatalogItem}
|
|
23
|
+
* DTOs are shared with `design.windows`.
|
|
24
|
+
*/
|
|
25
|
+
export abstract class PluginDesignDoorsApi {
|
|
26
|
+
constructor() {}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get the type name of a door — the label that identifies which kind of door
|
|
30
|
+
* the instance is, as shown in its properties.
|
|
31
|
+
*
|
|
32
|
+
* @param door The door to query
|
|
33
|
+
* @returns The type as a `string`, or `null`
|
|
34
|
+
*
|
|
35
|
+
* @examplePrompt What type of door is this?
|
|
36
|
+
* @examplePrompt Tell me the door type of the selected door
|
|
37
|
+
* @examplePrompt Is this a single or a double door?
|
|
38
|
+
* @examplePrompt Check what kind of door is on this wall
|
|
39
|
+
*
|
|
40
|
+
* # Example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
43
|
+
* const type = await snaptrude.design.doors.getType(door)
|
|
44
|
+
* if (type) console.log("door type:", type)
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
public abstract getType(door: ComponentHandle): PluginApiReturn<string | null>
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Get the family name of a door — the Revit or native family the door
|
|
51
|
+
* instance comes from.
|
|
52
|
+
*
|
|
53
|
+
* @param door The door to query
|
|
54
|
+
* @returns The family as a `string`, or `null`
|
|
55
|
+
*
|
|
56
|
+
* @examplePrompt Which family does this door belong to?
|
|
57
|
+
* @examplePrompt What's the Revit family of the selected door?
|
|
58
|
+
* @examplePrompt Show the family name for this door
|
|
59
|
+
* @examplePrompt Find out which door family the imported door uses
|
|
60
|
+
*
|
|
61
|
+
* # Example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const [door] = await snaptrude.design.query.listDoors()
|
|
64
|
+
* const family = await snaptrude.design.doors.getFamily(door)
|
|
65
|
+
* if (family) console.log("family:", family)
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
public abstract getFamily(door: ComponentHandle): PluginApiReturn<string | null>
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get the width of a door — how wide its opening is along the host wall.
|
|
72
|
+
*
|
|
73
|
+
* @param door The door to query
|
|
74
|
+
* @returns The width as a `number`, or `null`
|
|
75
|
+
*
|
|
76
|
+
* @examplePrompt How wide is this door?
|
|
77
|
+
* @examplePrompt What's the width of the selected door?
|
|
78
|
+
* @examplePrompt Measure the width of the entrance door
|
|
79
|
+
* @examplePrompt Check whether this door is 900mm wide
|
|
80
|
+
*
|
|
81
|
+
* # Example
|
|
82
|
+
* ```ts
|
|
83
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
84
|
+
* const width = await snaptrude.design.doors.getWidth(door)
|
|
85
|
+
* if (width !== null) console.log("door width:", width)
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
public abstract getWidth(door: ComponentHandle): PluginApiReturn<number | null>
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get the height of a door — how tall its opening is from base to head.
|
|
92
|
+
*
|
|
93
|
+
* @param door The door to query
|
|
94
|
+
* @returns The height as a `number`, or `null`
|
|
95
|
+
*
|
|
96
|
+
* @examplePrompt How tall is this door?
|
|
97
|
+
* @examplePrompt What's the height of the selected door?
|
|
98
|
+
* @examplePrompt Check the door height for this opening
|
|
99
|
+
* @examplePrompt Is the front door 2100mm high?
|
|
100
|
+
*
|
|
101
|
+
* # Example
|
|
102
|
+
* ```ts
|
|
103
|
+
* const [door] = await snaptrude.design.query.listDoors()
|
|
104
|
+
* const height = await snaptrude.design.doors.getHeight(door)
|
|
105
|
+
* if (height !== null) console.log("door height:", height)
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
public abstract getHeight(door: ComponentHandle): PluginApiReturn<number | null>
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get a door's full dimensions in one call — width along the wall, vertical
|
|
112
|
+
* height, and thickness through the wall — measured in the door's local
|
|
113
|
+
* oriented space. Parity with {@linkcode PluginDesignWindowsApi.getDimensions}.
|
|
114
|
+
*
|
|
115
|
+
* @param door The door to query
|
|
116
|
+
* @returns The dimensions, or `null`
|
|
117
|
+
*
|
|
118
|
+
* @examplePrompt What are the dimensions of this door?
|
|
119
|
+
* @examplePrompt How big is the selected door?
|
|
120
|
+
* @examplePrompt Give me the width, height and depth of this door
|
|
121
|
+
* @examplePrompt Measure the entrance door including its thickness through the wall
|
|
122
|
+
*
|
|
123
|
+
* # Example
|
|
124
|
+
* ```ts
|
|
125
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
126
|
+
* const dims = await snaptrude.design.doors.getDimensions(door)
|
|
127
|
+
* if (dims) console.log(dims.width, dims.height, dims.thickness)
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
public abstract getDimensions(
|
|
131
|
+
door: ComponentHandle
|
|
132
|
+
): PluginApiReturn<PluginDoorDimensions | null>
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Get the floor a door is hosted on — the storey/level component that
|
|
136
|
+
* supports the door.
|
|
137
|
+
*
|
|
138
|
+
* @param door The door to query
|
|
139
|
+
* @returns The support floor {@linkcode ComponentHandle}, or `null`
|
|
140
|
+
*
|
|
141
|
+
* @examplePrompt Which floor is this door on?
|
|
142
|
+
* @examplePrompt What storey does the selected door belong to?
|
|
143
|
+
* @examplePrompt Find the level that hosts this door
|
|
144
|
+
* @examplePrompt Tell me which floor the entrance door sits on
|
|
145
|
+
*
|
|
146
|
+
* # Example
|
|
147
|
+
* ```ts
|
|
148
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
149
|
+
* const floor = await snaptrude.design.doors.getSupportFloor(door)
|
|
150
|
+
* if (floor) {
|
|
151
|
+
* const props = await snaptrude.design.query.getProperties(floor)
|
|
152
|
+
* console.log("hosted on storey:", props.storey)
|
|
153
|
+
* }
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
public abstract getSupportFloor(door: ComponentHandle): PluginApiReturn<ComponentHandle | null>
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Get a door's swing (hinge) handedness. Stand on the side the door swings
|
|
160
|
+
* open to, facing the door: `'left'` when the hinged jamb is on your left,
|
|
161
|
+
* `'right'` when it is on your right. Derived from the placed mesh's
|
|
162
|
+
* orientation (the same reflection `mirror` and the `hinge` placement option
|
|
163
|
+
* apply), not a persisted field.
|
|
164
|
+
*
|
|
165
|
+
* @param door The door to query
|
|
166
|
+
* @returns `'left'` / `'right'`, or `null` if indeterminate
|
|
167
|
+
*
|
|
168
|
+
* @examplePrompt Which way does this door swing?
|
|
169
|
+
* @examplePrompt Is the selected door left-handed or right-handed?
|
|
170
|
+
* @examplePrompt Check the hinge side of this door
|
|
171
|
+
* @examplePrompt Does the entrance door open to the left or the right?
|
|
172
|
+
*
|
|
173
|
+
* # Example
|
|
174
|
+
* ```ts
|
|
175
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
176
|
+
* const swing = await snaptrude.design.doors.getSwingDirection(door)
|
|
177
|
+
* if (swing) console.log("opens as a", swing, "hand door")
|
|
178
|
+
* ```
|
|
179
|
+
*/
|
|
180
|
+
public abstract getSwingDirection(
|
|
181
|
+
door: ComponentHandle
|
|
182
|
+
): PluginApiReturn<"left" | "right" | null>
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Mirror a door about its own axes. `'x'` (default) flips the swing side —
|
|
186
|
+
* the door opens to the other side of the wall; `'z'` swaps the hinged jamb
|
|
187
|
+
* (left-hand ↔ right-hand, same swing side); `'y'` turns it upside down.
|
|
188
|
+
* Undoable as a single command.
|
|
189
|
+
*
|
|
190
|
+
* @param door The door to mirror
|
|
191
|
+
* @param axis Reflection axis (optional; default `'x'` — the swing-flip axis; `'z'` — the hinge-jamb axis)
|
|
192
|
+
* @returns The affected door(s)
|
|
193
|
+
*
|
|
194
|
+
* @examplePrompt Flip this door's swing
|
|
195
|
+
* @examplePrompt Mirror the selected door
|
|
196
|
+
* @examplePrompt Make this door open the other way
|
|
197
|
+
* @examplePrompt Reverse the hinge side of the entrance door
|
|
198
|
+
* @examplePrompt Change the door to swing from the other side
|
|
199
|
+
*
|
|
200
|
+
* # Example
|
|
201
|
+
* ```ts
|
|
202
|
+
* // Flip the selected door's swing side — axis defaults to "x"
|
|
203
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
204
|
+
* const { affected } = await snaptrude.design.doors.mirror(door)
|
|
205
|
+
* // …or swap the hinged jamb instead (keeps the swing side)
|
|
206
|
+
* await snaptrude.design.doors.mirror(door, "z")
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
public abstract mirror(
|
|
210
|
+
door: ComponentHandle,
|
|
211
|
+
axis?: PluginMirrorAxis
|
|
212
|
+
): PluginApiReturn<PluginDesignChangeResult>
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Set the width of one or more doors, resizing each opening and re-cutting
|
|
216
|
+
* the host wall. Width is in engine units; the change is undoable.
|
|
217
|
+
*
|
|
218
|
+
* @param doors The doors to resize
|
|
219
|
+
* @param width New width (engine units)
|
|
220
|
+
* @returns The affected doors
|
|
221
|
+
*
|
|
222
|
+
* @examplePrompt Make this door 900mm wide
|
|
223
|
+
* @examplePrompt Widen the selected doors to 1 metre
|
|
224
|
+
* @examplePrompt Change the door width to 3 feet
|
|
225
|
+
* @examplePrompt Resize all the bathroom doors to 750 wide
|
|
226
|
+
* @examplePrompt Narrow the entrance door a bit
|
|
227
|
+
*
|
|
228
|
+
* # Example
|
|
229
|
+
* ```ts
|
|
230
|
+
* // Resize every ground-floor door to a common width (engine units)
|
|
231
|
+
* const doors = await snaptrude.design.query.listDoors({ storeys: [1] })
|
|
232
|
+
* const { affected } = await snaptrude.design.doors.setWidth(doors, 900)
|
|
233
|
+
* console.log("resized", affected.length, "doors")
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
public abstract setWidth(
|
|
237
|
+
doors: ComponentHandle[],
|
|
238
|
+
width: number
|
|
239
|
+
): PluginApiReturn<PluginDesignChangeResult>
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Set the height of one or more doors, resizing each opening and re-cutting
|
|
243
|
+
* the host wall. Height is in engine units; the change is undoable.
|
|
244
|
+
*
|
|
245
|
+
* @param doors The doors to resize
|
|
246
|
+
* @param height New height (engine units)
|
|
247
|
+
* @returns The affected doors
|
|
248
|
+
*
|
|
249
|
+
* @examplePrompt Make this door 2100mm tall
|
|
250
|
+
* @examplePrompt Change the door height to 7 feet
|
|
251
|
+
* @examplePrompt Raise the selected doors to 2.4m high
|
|
252
|
+
* @examplePrompt Set all the doors on this storey to 2100 high
|
|
253
|
+
*
|
|
254
|
+
* # Example
|
|
255
|
+
* ```ts
|
|
256
|
+
* // setHeight takes an array — wrap a single door
|
|
257
|
+
* const [door] = await snaptrude.design.query.listDoors({ isSelected: true })
|
|
258
|
+
* await snaptrude.design.doors.setHeight([door], 2100)
|
|
259
|
+
* ```
|
|
260
|
+
*/
|
|
261
|
+
public abstract setHeight(
|
|
262
|
+
doors: ComponentHandle[],
|
|
263
|
+
height: number
|
|
264
|
+
): PluginApiReturn<PluginDesignChangeResult>
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* List the door catalog **groups** — the placement families (Swing, Sliding,
|
|
268
|
+
* Folding, Pivot, …), built-in groups merged with any team-custom types.
|
|
269
|
+
*
|
|
270
|
+
* @returns The groups as {@linkcode PluginObjectCatalogGroup}`[]` (`[]` when empty)
|
|
271
|
+
*
|
|
272
|
+
* @examplePrompt What kinds of doors can I place?
|
|
273
|
+
* @examplePrompt List the door groups in the catalog
|
|
274
|
+
* @examplePrompt Show me the door families available in this project
|
|
275
|
+
* @examplePrompt Which door types does this project support?
|
|
276
|
+
*
|
|
277
|
+
* # Example
|
|
278
|
+
* ```ts
|
|
279
|
+
* const groups = await snaptrude.design.doors.listCatalogGroups()
|
|
280
|
+
* for (const g of groups) console.log(g.dbType, g.label, g.source)
|
|
281
|
+
* ```
|
|
282
|
+
*/
|
|
283
|
+
public abstract listCatalogGroups(): PluginApiReturn<PluginObjectCatalogGroup[]>
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* List the placeable door catalog (team + general libraries), optionally
|
|
287
|
+
* restricted to one group by its `dbType` token.
|
|
288
|
+
*
|
|
289
|
+
* @param group Restrict to one group's `dbType` (optional; e.g. `"singleDoor"`)
|
|
290
|
+
* @returns The catalog as {@linkcode PluginObjectCatalogItem}`[]` (`[]` when empty)
|
|
291
|
+
*
|
|
292
|
+
* @examplePrompt What doors can I place in this project?
|
|
293
|
+
* @examplePrompt List every door in the library
|
|
294
|
+
* @examplePrompt Show me the sliding doors I can add
|
|
295
|
+
* @examplePrompt Browse the door catalog
|
|
296
|
+
*
|
|
297
|
+
* # Example
|
|
298
|
+
* ```ts
|
|
299
|
+
* const [group] = await snaptrude.design.doors.listCatalogGroups()
|
|
300
|
+
* const items = await snaptrude.design.doors.listCatalog(group?.dbType)
|
|
301
|
+
* for (const item of items) console.log(item.id, item.name, item.thumbnailUrl)
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
public abstract listCatalog(
|
|
305
|
+
group?: string
|
|
306
|
+
): PluginApiReturn<PluginObjectCatalogItem[]>
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Get a single door catalog item by its library id.
|
|
310
|
+
*
|
|
311
|
+
* @param id The catalog library id
|
|
312
|
+
* @returns The item, or `null` if no catalog item matches
|
|
313
|
+
*
|
|
314
|
+
* @examplePrompt Get the details of this door from the library
|
|
315
|
+
* @examplePrompt Look up the catalog entry for this door id
|
|
316
|
+
* @examplePrompt What is the cost of this door item?
|
|
317
|
+
* @examplePrompt Show me the family name of this door in the catalog
|
|
318
|
+
*
|
|
319
|
+
* # Example
|
|
320
|
+
* ```ts
|
|
321
|
+
* const [entry] = await snaptrude.design.doors.listCatalog()
|
|
322
|
+
* const item = await snaptrude.design.doors.getCatalogItem(entry.id)
|
|
323
|
+
* if (item) console.log(item.name, item.source, item.dbType)
|
|
324
|
+
* ```
|
|
325
|
+
*/
|
|
326
|
+
public abstract getCatalogItem(
|
|
327
|
+
id: string
|
|
328
|
+
): PluginApiReturn<PluginObjectCatalogItem | null>
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Test whether a door catalog item exists for the given library id.
|
|
332
|
+
*
|
|
333
|
+
* @param id The catalog library id
|
|
334
|
+
* @returns `true` if it exists, otherwise `false`
|
|
335
|
+
*
|
|
336
|
+
* @examplePrompt Is this door still in the library?
|
|
337
|
+
* @examplePrompt Check whether a door catalog item with this id exists
|
|
338
|
+
* @examplePrompt Does my team library have this door?
|
|
339
|
+
* @examplePrompt Verify the door is available before placing it
|
|
340
|
+
*
|
|
341
|
+
* # Example
|
|
342
|
+
* ```ts
|
|
343
|
+
* const [entry] = await snaptrude.design.doors.listCatalog()
|
|
344
|
+
* const stillAvailable = await snaptrude.design.doors.exists(entry.id)
|
|
345
|
+
* console.log(stillAvailable ? "safe to place" : "removed from library")
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
348
|
+
public abstract exists(id: string): PluginApiReturn<boolean>
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Arguments for the single-door read methods.
|
|
353
|
+
*
|
|
354
|
+
* | Property | Type | Description |
|
|
355
|
+
* |---|---|---|
|
|
356
|
+
* | `door` | {@linkcode ComponentHandle} | The door to query |
|
|
357
|
+
*/
|
|
358
|
+
export const PluginDesignDoorArgs = z.object({
|
|
359
|
+
door: ComponentHandle,
|
|
360
|
+
})
|
|
361
|
+
export type PluginDesignDoorArgs = z.infer<typeof PluginDesignDoorArgs>
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* A door's dimensions (engine units), symmetric with {@linkcode PluginWindowDimensions}.
|
|
365
|
+
*
|
|
366
|
+
* | Property | Type | Description |
|
|
367
|
+
* |---|---|---|
|
|
368
|
+
* | `width` | `number` | Along the wall |
|
|
369
|
+
* | `height` | `number` | Vertical |
|
|
370
|
+
* | `thickness` | `number` | Through the wall (engine `length` axis) |
|
|
371
|
+
*/
|
|
372
|
+
export const PluginDoorDimensions = z.object({
|
|
373
|
+
width: z.number(),
|
|
374
|
+
height: z.number(),
|
|
375
|
+
thickness: z.number(),
|
|
376
|
+
})
|
|
377
|
+
export type PluginDoorDimensions = z.infer<typeof PluginDoorDimensions>
|
|
378
|
+
|
|
379
|
+
/** Mirror axis — tokens mirror the engine `FlipDirection` verbatim: `'x'` flips the swing side, `'z'` swaps the hinged jamb, `'y'` turns the door upside down. */
|
|
380
|
+
export const PluginMirrorAxis = z.enum(["x", "y", "z"])
|
|
381
|
+
export type PluginMirrorAxis = z.infer<typeof PluginMirrorAxis>
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Arguments for {@linkcode PluginDesignDoorsApi.mirror}.
|
|
385
|
+
*
|
|
386
|
+
* | Property | Type | Description |
|
|
387
|
+
* |---|---|---|
|
|
388
|
+
* | `door` | {@linkcode ComponentHandle} | The door to mirror |
|
|
389
|
+
* | `axis` | {@linkcode PluginMirrorAxis} | Reflection axis (optional; default `'x'` — the swing-flip axis; `'z'` — the hinge-jamb axis) |
|
|
390
|
+
*/
|
|
391
|
+
export const PluginDesignDoorMirrorArgs = z.object({
|
|
392
|
+
door: ComponentHandle,
|
|
393
|
+
axis: PluginMirrorAxis.optional(),
|
|
394
|
+
})
|
|
395
|
+
export type PluginDesignDoorMirrorArgs = z.infer<typeof PluginDesignDoorMirrorArgs>
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Arguments for {@linkcode PluginDesignDoorsApi.setWidth}.
|
|
399
|
+
*
|
|
400
|
+
* | Property | Type | Description |
|
|
401
|
+
* |---|---|---|
|
|
402
|
+
* | `doors` | {@linkcode ComponentHandle}`[]` | The doors to resize |
|
|
403
|
+
* | `width` | `number` | New width (engine units) |
|
|
404
|
+
*/
|
|
405
|
+
export const PluginDesignDoorSetWidthArgs = z.object({
|
|
406
|
+
doors: z.array(ComponentHandle),
|
|
407
|
+
width: z.number(),
|
|
408
|
+
})
|
|
409
|
+
export type PluginDesignDoorSetWidthArgs = z.infer<typeof PluginDesignDoorSetWidthArgs>
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Arguments for {@linkcode PluginDesignDoorsApi.setHeight}.
|
|
413
|
+
*
|
|
414
|
+
* | Property | Type | Description |
|
|
415
|
+
* |---|---|---|
|
|
416
|
+
* | `doors` | {@linkcode ComponentHandle}`[]` | The doors to resize |
|
|
417
|
+
* | `height` | `number` | New height (engine units) |
|
|
418
|
+
*/
|
|
419
|
+
export const PluginDesignDoorSetHeightArgs = z.object({
|
|
420
|
+
doors: z.array(ComponentHandle),
|
|
421
|
+
height: z.number(),
|
|
422
|
+
})
|
|
423
|
+
export type PluginDesignDoorSetHeightArgs = z.infer<typeof PluginDesignDoorSetHeightArgs>
|
|
424
|
+
|
|
425
|
+
// ---------------------------------------------------------------------------
|
|
426
|
+
// catalog (shared by doors + windows)
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* A door/window catalog **group** — a placement family (e.g. Swing, Sliding,
|
|
431
|
+
* Casement). Shared by `design.doors` and `design.windows`.
|
|
432
|
+
*
|
|
433
|
+
* | Property | Type | Description |
|
|
434
|
+
* |---|---|---|
|
|
435
|
+
* | `dbType` | `string` | Stable engine token (e.g. `singleDoor`, `casementDouble`) |
|
|
436
|
+
* | `label` | `string` | Human-readable group label (e.g. `"Swing - 1 Shutter"`) |
|
|
437
|
+
* | `source` | `'default' \| 'team'` | Built-in group or a team-custom type |
|
|
438
|
+
*/
|
|
439
|
+
export const PluginObjectCatalogGroup = z.object({
|
|
440
|
+
dbType: z.string(),
|
|
441
|
+
label: z.string(),
|
|
442
|
+
source: z.enum(["default", "team"]),
|
|
443
|
+
})
|
|
444
|
+
export type PluginObjectCatalogGroup = z.infer<typeof PluginObjectCatalogGroup>
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* A placeable door/window catalog **item** (value record — not a scene
|
|
448
|
+
* entity/handle). Shared by `design.doors` and `design.windows`; symmetric with
|
|
449
|
+
* {@linkcode PluginFurnitureCatalogItem}. The raw mesh (`.babylon`) URL is never
|
|
450
|
+
* exposed — only `thumbnailUrl`.
|
|
451
|
+
*
|
|
452
|
+
* | Property | Type | Description |
|
|
453
|
+
* |---|---|---|
|
|
454
|
+
* | `id` | `string` | Library id (team `_id` or general `fullName`) — pass to `design.create.door`/`window` |
|
|
455
|
+
* | `name` | `string` | Display name |
|
|
456
|
+
* | `source` | `'team' \| 'general'` | Which library it came from |
|
|
457
|
+
* | `dbType` | `string` | The group token it belongs to (e.g. `singleDoor`) |
|
|
458
|
+
* | `subType` | `string`? | Engine sub-type (optional) |
|
|
459
|
+
* | `thumbnailUrl` | `string`? | Preview thumbnail URL (optional) |
|
|
460
|
+
* | `cost` | `number`? | Cost (optional; team items) |
|
|
461
|
+
* | `familyName` | `string`? | Family name (optional) |
|
|
462
|
+
*/
|
|
463
|
+
export const PluginObjectCatalogItem = z.object({
|
|
464
|
+
id: z.string(),
|
|
465
|
+
name: z.string(),
|
|
466
|
+
source: z.enum(["team", "general"]),
|
|
467
|
+
dbType: z.string(),
|
|
468
|
+
subType: z.string().optional(),
|
|
469
|
+
thumbnailUrl: z.string().optional(),
|
|
470
|
+
cost: z.number().optional(),
|
|
471
|
+
familyName: z.string().optional(),
|
|
472
|
+
})
|
|
473
|
+
export type PluginObjectCatalogItem = z.infer<typeof PluginObjectCatalogItem>
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Arguments for {@linkcode PluginDesignDoorsApi.listCatalog}.
|
|
477
|
+
*
|
|
478
|
+
* | Property | Type | Description |
|
|
479
|
+
* |---|---|---|
|
|
480
|
+
* | `group` | `string`? | Restrict to one group's `dbType` token (optional) |
|
|
481
|
+
*/
|
|
482
|
+
export const PluginDesignDoorListCatalogArgs = z.object({
|
|
483
|
+
group: z.string().optional(),
|
|
484
|
+
})
|
|
485
|
+
export type PluginDesignDoorListCatalogArgs = z.infer<typeof PluginDesignDoorListCatalogArgs>
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* Arguments for {@linkcode PluginDesignDoorsApi.getCatalogItem} / {@linkcode PluginDesignDoorsApi.exists}.
|
|
489
|
+
*
|
|
490
|
+
* | Property | Type | Description |
|
|
491
|
+
* |---|---|---|
|
|
492
|
+
* | `id` | `string` | The catalog library id |
|
|
493
|
+
*/
|
|
494
|
+
export const PluginDesignDoorGetCatalogItemArgs = z.object({
|
|
495
|
+
id: z.string(),
|
|
496
|
+
})
|
|
497
|
+
export type PluginDesignDoorGetCatalogItemArgs = z.infer<typeof PluginDesignDoorGetCatalogItemArgs>
|
|
498
|
+
|
|
499
|
+
export const PluginDesignDoorExistsArgs = PluginDesignDoorGetCatalogItemArgs
|
|
500
|
+
export type PluginDesignDoorExistsArgs = z.infer<typeof PluginDesignDoorExistsArgs>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../../types"
|
|
3
|
+
import { ComponentHandle, Vec3Handle } from "../../../handles"
|
|
4
|
+
import { OffsetSplitOutcome } from "../shared"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* STAGED (LLD Wave 2) — abstract shell only. NOT yet wired into `PluginDesignApi`
|
|
8
|
+
* and has no host implementation. `offsetSplit` migrates off `tools.offset` (adding
|
|
9
|
+
* the previously-dropped `offsetValue` to the result).
|
|
10
|
+
*
|
|
11
|
+
* `snaptrude.design.edit` — non-create geometry edits (offset-split, and later
|
|
12
|
+
* push-pull / topology edits). Undoable.
|
|
13
|
+
*
|
|
14
|
+
* TRANSPORT: positional args per method.
|
|
15
|
+
*/
|
|
16
|
+
export abstract class PluginDesignEditApi {
|
|
17
|
+
constructor() {}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Offset the top profile of a component by a distance and split the face along
|
|
21
|
+
* the offset curve. Positive distances offset outward, negative inward.
|
|
22
|
+
* Single-component only (the engine rejects batches).
|
|
23
|
+
* @param component - The component whose top profile is offset-split.
|
|
24
|
+
* @param offsetDistance - Offset distance; positive = outward, negative = inward.
|
|
25
|
+
* @param options - Optional settings: `profilePickPoint` picks the profile when ambiguous.
|
|
26
|
+
* @returns {@linkcode OffsetSplitOutcome} `{ createdIds, deletedIds, offsetValue }`
|
|
27
|
+
*
|
|
28
|
+
* @examplePrompt Offset the top face of this mass inward by 2 metres and split it
|
|
29
|
+
* @examplePrompt Create a 1m setback border on top of the selected mass
|
|
30
|
+
* @examplePrompt Split the roof profile with a 500mm inward offset
|
|
31
|
+
* @examplePrompt Offset-split the slab's top profile outward by 3 feet
|
|
32
|
+
*
|
|
33
|
+
* # Example
|
|
34
|
+
* ```ts
|
|
35
|
+
* // Offset the top profile inward by 2 units and split the face along it
|
|
36
|
+
* const [mass] = await snaptrude.design.query.listMasses()
|
|
37
|
+
* const { createdIds, offsetValue } = await snaptrude.design.edit.offsetSplit(mass, -2)
|
|
38
|
+
* // offsetValue is the post-clamp distance the engine actually applied
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
public abstract offsetSplit(
|
|
42
|
+
component: ComponentHandle,
|
|
43
|
+
offsetDistance: number,
|
|
44
|
+
options?: { profilePickPoint?: Vec3Handle },
|
|
45
|
+
): PluginApiReturn<OffsetSplitOutcome>
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Positional target: offsetSplit(component, offsetDistance, options?)
|
|
49
|
+
export const PluginDesignOffsetSplitArgs = z.object({
|
|
50
|
+
component: ComponentHandle,
|
|
51
|
+
offsetDistance: z.number(),
|
|
52
|
+
profilePickPoint: Vec3Handle.optional(),
|
|
53
|
+
})
|
|
54
|
+
export type PluginDesignOffsetSplitArgs = z.infer<typeof PluginDesignOffsetSplitArgs>
|