@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,52 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../../types"
|
|
3
|
+
import {
|
|
4
|
+
PluginReferenceLineGetProperty,
|
|
5
|
+
PluginReferenceLineGetResult,
|
|
6
|
+
} from "../../entity/referenceLine"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* `design.query.referenceLines.*` — reference-line-specific reads.
|
|
10
|
+
*
|
|
11
|
+
* A **reference line** is a 2D guide line (or arc) in the scene, typically used
|
|
12
|
+
* for grid lines and alignment guides. Enumerate reference lines with
|
|
13
|
+
* `design.query.listReferenceLines`; read an individual line's properties here.
|
|
14
|
+
* This is the canonical home of the read formerly at `entity.referenceLine.get`
|
|
15
|
+
* (now deprecated).
|
|
16
|
+
*
|
|
17
|
+
* Accessed via `snaptrude.design.query.referenceLines`.
|
|
18
|
+
*/
|
|
19
|
+
export abstract class PluginDesignQueryReferenceLinesApi {
|
|
20
|
+
constructor() {}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get properties of a reference line by its ID.
|
|
24
|
+
*
|
|
25
|
+
* Only the properties listed in `properties` are returned — unlisted
|
|
26
|
+
* properties will be `undefined` in the result.
|
|
27
|
+
*
|
|
28
|
+
* @param referenceLineId - The unique reference line ID
|
|
29
|
+
* @param properties - Array of property names to retrieve. See
|
|
30
|
+
* {@linkcode PluginReferenceLineGetProperty}.
|
|
31
|
+
* @returns A partial {@linkcode PluginReferenceLineGetResult} containing only the
|
|
32
|
+
* requested properties
|
|
33
|
+
* @throws If the reference line does not exist
|
|
34
|
+
*
|
|
35
|
+
* @examplePrompt Get the curve geometry of this reference line
|
|
36
|
+
* @examplePrompt Where does this grid line run?
|
|
37
|
+
* @examplePrompt Read the geometry of a guide line by its id
|
|
38
|
+
* @examplePrompt Look up the curve of the selected reference line
|
|
39
|
+
*
|
|
40
|
+
* # Example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const [refLine] = await snaptrude.design.query.listReferenceLines()
|
|
43
|
+
* const result = await snaptrude.design.query.referenceLines.get(refLine, ["curve"])
|
|
44
|
+
* // result.curve is an opaque CurveHandle; read its coordinates via
|
|
45
|
+
* // `snaptrude.core.geom.curve`.
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
public abstract get(
|
|
49
|
+
referenceLineId: string,
|
|
50
|
+
properties: z.infer<typeof PluginReferenceLineGetProperty>[],
|
|
51
|
+
): PluginApiReturn<PluginReferenceLineGetResult>
|
|
52
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../../types"
|
|
3
|
+
import { ComponentHandle, ContourHandle } from "../../../handles"
|
|
4
|
+
import { PluginSpaceGetProperty, PluginSpaceGetResult } from "../../entity/space"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* `design.query.spaces.*` — space-specific reads (a space is a room mass).
|
|
8
|
+
*
|
|
9
|
+
* Only the space queries feasible against the engine today are exposed here.
|
|
10
|
+
* `getFloor` / `listBoundingWalls` (space↔wall topology) are deferred — they need
|
|
11
|
+
* engine work that does not exist yet. `listAdjacent` stays deferred because the
|
|
12
|
+
* shipped surfaces already answer it with value semantics: per-space via the
|
|
13
|
+
* `adjacency` field of `design.query.getProperties`, in bulk via
|
|
14
|
+
* `program.adjacency.getMatrix`.
|
|
15
|
+
*
|
|
16
|
+
* Accessed via `snaptrude.design.query.spaces`.
|
|
17
|
+
*/
|
|
18
|
+
export abstract class PluginDesignQuerySpacesApi {
|
|
19
|
+
constructor() {}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Get selected properties of a space — the selective multi-property read.
|
|
23
|
+
*
|
|
24
|
+
* Only the properties listed in `properties` are returned — unlisted
|
|
25
|
+
* properties will be `undefined` in the result. This is the canonical home of
|
|
26
|
+
* the read formerly at `entity.space.get` (now deprecated). Adjacency is not
|
|
27
|
+
* part of this read — it is an entity property: read it via the `adjacency`
|
|
28
|
+
* field of {@linkcode PluginDesignQueryApi.getProperties}.
|
|
29
|
+
*
|
|
30
|
+
* @param space - The space (room mass) to read
|
|
31
|
+
* @param properties - Array of property names to retrieve. See
|
|
32
|
+
* {@linkcode PluginDesignQuerySpacesGetProperty} for available values.
|
|
33
|
+
* @returns A partial {@linkcode PluginDesignQuerySpacesGetResult} containing only
|
|
34
|
+
* the requested properties
|
|
35
|
+
* @throws If the space does not exist or the component is not a space/mass
|
|
36
|
+
*
|
|
37
|
+
* @examplePrompt What is the area of this room?
|
|
38
|
+
* @examplePrompt Get the name, storey and height of the selected space
|
|
39
|
+
* @examplePrompt Which department does this room belong to?
|
|
40
|
+
* @examplePrompt Where is this space positioned on the plan?
|
|
41
|
+
* @examplePrompt Read the room type and dimensions of the selected room
|
|
42
|
+
*
|
|
43
|
+
* # Example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const [space] = await snaptrude.design.query.listSpaces()
|
|
46
|
+
* const info = await snaptrude.design.query.spaces.get(space, ["name", "area", "position"])
|
|
47
|
+
* console.log(info.name, info.area, info.position)
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
public abstract get(
|
|
51
|
+
space: ComponentHandle,
|
|
52
|
+
properties: PluginDesignQuerySpacesGetArgs["properties"],
|
|
53
|
+
): PluginApiReturn<PluginDesignQuerySpacesGetResult>
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Get the **footprint** of a space — its bottom-face contour (outer profile +
|
|
57
|
+
* holes) as a reusable {@linkcode ContourHandle}. Equivalent to
|
|
58
|
+
* {@linkcode PluginDesignQueryGeometryApi.getBottomContour} narrowed to spaces.
|
|
59
|
+
*
|
|
60
|
+
* @param space - The space (room mass) to read
|
|
61
|
+
* @returns the footprint {@linkcode ContourHandle}, or `null` if the space has
|
|
62
|
+
* no extractable footprint
|
|
63
|
+
*
|
|
64
|
+
* @examplePrompt Get the footprint of this room
|
|
65
|
+
* @examplePrompt Trace the floor outline of the selected space
|
|
66
|
+
* @examplePrompt What is the plan boundary of this room, including any holes?
|
|
67
|
+
* @examplePrompt Give me the base profile of the selected room mass
|
|
68
|
+
*
|
|
69
|
+
* # Example
|
|
70
|
+
* ```ts
|
|
71
|
+
* const [space] = await snaptrude.design.query.listSpaces()
|
|
72
|
+
* const footprint = await snaptrude.design.query.spaces.getFootprint(space)
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
public abstract getFootprint(
|
|
76
|
+
space: ComponentHandle,
|
|
77
|
+
): PluginApiReturn<ContourHandle | null>
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Get the **enclosure** of a space — the floor and ceiling that cap it, the
|
|
81
|
+
* bounding walls around it (with each wall's door/window openings), and the
|
|
82
|
+
* neighbouring spaces it shares a boundary with.
|
|
83
|
+
*
|
|
84
|
+
* **Geometric v1 — best effort.** The engine has no persisted space→surface
|
|
85
|
+
* topology, so this read is derived purely from *plan geometry*: the space
|
|
86
|
+
* footprint is matched against the plan footprints/baselines of the slabs and
|
|
87
|
+
* walls on the same storey. Consequences a caller must account for:
|
|
88
|
+
*
|
|
89
|
+
* - `faceIndices` is **always `[]`**. The triangle→B-rep-face provenance that
|
|
90
|
+
* would populate it is a separate engine capability that does not exist yet;
|
|
91
|
+
* read a surface's full geometry via
|
|
92
|
+
* {@linkcode PluginDesignQueryGeometryApi.getBrep} on its `component` instead.
|
|
93
|
+
* - After heavy edits (move / stretch / boolean) or on imported models the plan
|
|
94
|
+
* match can miss or mis-attribute a surface — treat the result as advisory,
|
|
95
|
+
* not authoritative.
|
|
96
|
+
* - `adjacentSpaces` comes from the same adjacency data as
|
|
97
|
+
* {@linkcode PluginProgramAdjacencyApi.getMatrix} (so the two agree on which
|
|
98
|
+
* spaces neighbour). `sharedEdgeLength` is `0` because that data exposes no
|
|
99
|
+
* edge length, and `sharedSurface` is the common boundary wall only when one
|
|
100
|
+
* is found geometrically (else `null`).
|
|
101
|
+
*
|
|
102
|
+
* Read-only; never mutates the model.
|
|
103
|
+
*
|
|
104
|
+
* @param space - The space (room mass) to read
|
|
105
|
+
* @returns the {@linkcode PluginSpaceEnclosure}, or `null` when `space` is not a
|
|
106
|
+
* space (room mass) or has no extractable plan footprint
|
|
107
|
+
*
|
|
108
|
+
* @examplePrompt What walls, floor and ceiling enclose this room?
|
|
109
|
+
* @examplePrompt Which of this room's walls are external?
|
|
110
|
+
* @examplePrompt List the doors and windows around the selected space
|
|
111
|
+
* @examplePrompt Which spaces are adjacent to this room, and through which wall?
|
|
112
|
+
*
|
|
113
|
+
* # Example
|
|
114
|
+
* ```ts
|
|
115
|
+
* const [space] = await snaptrude.design.query.listSpaces()
|
|
116
|
+
* const enclosure = await snaptrude.design.query.spaces.getEnclosure(space)
|
|
117
|
+
* if (enclosure) {
|
|
118
|
+
* const walls = enclosure.surfaces.filter((s) => s.role === "wall")
|
|
119
|
+
* const external = walls.filter((s) => s.isExternal)
|
|
120
|
+
* console.log(`${walls.length} walls, ${external.length} external`)
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
public abstract getEnclosure(
|
|
125
|
+
space: ComponentHandle,
|
|
126
|
+
): PluginApiReturn<PluginSpaceEnclosure | null>
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Arguments for {@linkcode PluginDesignQuerySpacesApi.getFootprint}.
|
|
131
|
+
*
|
|
132
|
+
* | Property | Type | Description |
|
|
133
|
+
* |---|---|---|
|
|
134
|
+
* | `space` | {@linkcode ComponentHandle} | The space (room mass) to read |
|
|
135
|
+
*/
|
|
136
|
+
export const PluginDesignQueryGetFootprintArgs = z.object({
|
|
137
|
+
space: ComponentHandle,
|
|
138
|
+
})
|
|
139
|
+
export type PluginDesignQueryGetFootprintArgs = z.infer<
|
|
140
|
+
typeof PluginDesignQueryGetFootprintArgs
|
|
141
|
+
>
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Property names readable via {@linkcode PluginDesignQuerySpacesApi.get} — the
|
|
145
|
+
* legacy {@linkcode PluginSpaceGetProperty} set minus `"adjacency"` (adjacency is
|
|
146
|
+
* an entity property: see the `adjacency` field of
|
|
147
|
+
* {@linkcode PluginDesignQueryApi.getProperties}).
|
|
148
|
+
*/
|
|
149
|
+
export const PluginDesignQuerySpacesGetProperty =
|
|
150
|
+
PluginSpaceGetProperty.exclude(["adjacency"])
|
|
151
|
+
export type PluginDesignQuerySpacesGetProperty = z.infer<
|
|
152
|
+
typeof PluginDesignQuerySpacesGetProperty
|
|
153
|
+
>
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Arguments for {@linkcode PluginDesignQuerySpacesApi.get}.
|
|
157
|
+
*
|
|
158
|
+
* | Property | Type | Description |
|
|
159
|
+
* |---|---|---|
|
|
160
|
+
* | `space` | {@linkcode ComponentHandle} | The space (room mass) to read |
|
|
161
|
+
* | `properties` | {@linkcode PluginDesignQuerySpacesGetProperty}`[]` | Properties to retrieve |
|
|
162
|
+
*/
|
|
163
|
+
export const PluginDesignQuerySpacesGetArgs = z.object({
|
|
164
|
+
space: ComponentHandle,
|
|
165
|
+
properties: z.array(PluginDesignQuerySpacesGetProperty),
|
|
166
|
+
})
|
|
167
|
+
export type PluginDesignQuerySpacesGetArgs = z.infer<
|
|
168
|
+
typeof PluginDesignQuerySpacesGetArgs
|
|
169
|
+
>
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Result of {@linkcode PluginDesignQuerySpacesApi.get} — the legacy
|
|
173
|
+
* {@linkcode PluginSpaceGetResult} record minus `adjacency`. Partial: only the
|
|
174
|
+
* requested properties are present.
|
|
175
|
+
*/
|
|
176
|
+
export const PluginDesignQuerySpacesGetResult = PluginSpaceGetResult.omit({
|
|
177
|
+
adjacency: true,
|
|
178
|
+
})
|
|
179
|
+
export type PluginDesignQuerySpacesGetResult = z.infer<
|
|
180
|
+
typeof PluginDesignQuerySpacesGetResult
|
|
181
|
+
>
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Arguments for {@linkcode PluginDesignQuerySpacesApi.getEnclosure}.
|
|
185
|
+
*
|
|
186
|
+
* | Property | Type | Description |
|
|
187
|
+
* |---|---|---|
|
|
188
|
+
* | `space` | {@linkcode ComponentHandle} | The space (room mass) to read |
|
|
189
|
+
*/
|
|
190
|
+
export const PluginDesignQuerySpacesGetEnclosureArgs = z.object({
|
|
191
|
+
space: ComponentHandle,
|
|
192
|
+
})
|
|
193
|
+
export type PluginDesignQuerySpacesGetEnclosureArgs = z.infer<
|
|
194
|
+
typeof PluginDesignQuerySpacesGetEnclosureArgs
|
|
195
|
+
>
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* The role a bounding surface plays in a {@linkcode PluginSpaceEnclosure}:
|
|
199
|
+
* `"floor"` (slab below), `"ceiling"` (slab/roof above), or `"wall"`.
|
|
200
|
+
*/
|
|
201
|
+
export const PluginEnclosureRole = z.enum(["floor", "ceiling", "wall"])
|
|
202
|
+
export type PluginEnclosureRole = z.infer<typeof PluginEnclosureRole>
|
|
203
|
+
|
|
204
|
+
/** The kind of opening hosted in a bounding wall. */
|
|
205
|
+
export const PluginEnclosureOpeningKind = z.enum(["door", "window", "void"])
|
|
206
|
+
export type PluginEnclosureOpeningKind = z.infer<
|
|
207
|
+
typeof PluginEnclosureOpeningKind
|
|
208
|
+
>
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* One opening (door / window / void) in a bounding wall.
|
|
212
|
+
*
|
|
213
|
+
* | Property | Type | Description |
|
|
214
|
+
* |---|---|---|
|
|
215
|
+
* | `kind` | {@linkcode PluginEnclosureOpeningKind} | `"door"`, `"window"`, or `"void"` |
|
|
216
|
+
* | `component` | {@linkcode ComponentHandle} | The opening entity |
|
|
217
|
+
*/
|
|
218
|
+
export const PluginEnclosureOpening = z.object({
|
|
219
|
+
kind: PluginEnclosureOpeningKind,
|
|
220
|
+
component: ComponentHandle,
|
|
221
|
+
})
|
|
222
|
+
export type PluginEnclosureOpening = z.infer<typeof PluginEnclosureOpening>
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* One bounding surface of a space's enclosure.
|
|
226
|
+
*
|
|
227
|
+
* | Property | Type | Description |
|
|
228
|
+
* |---|---|---|
|
|
229
|
+
* | `role` | {@linkcode PluginEnclosureRole} | `"floor"`, `"ceiling"`, or `"wall"` |
|
|
230
|
+
* | `component` | {@linkcode ComponentHandle} | The wall / slab / roof entity |
|
|
231
|
+
* | `faceIndices` | `number[]` | B-rep face indices facing the space. **Always `[]` in geometric v1** (no triangle→face provenance yet) |
|
|
232
|
+
* | `isExternal` | `boolean` | No space on the other side — for a wall, no other room bounds it; for a floor/ceiling, no room caps the storey below/above |
|
|
233
|
+
* | `openings` | {@linkcode PluginEnclosureOpening}`[]` | Doors/windows/voids in the surface (walls only; `[]` for floor/ceiling in v1) |
|
|
234
|
+
*/
|
|
235
|
+
export const PluginEnclosureSurface = z.object({
|
|
236
|
+
role: PluginEnclosureRole,
|
|
237
|
+
component: ComponentHandle,
|
|
238
|
+
faceIndices: z.array(z.number()),
|
|
239
|
+
isExternal: z.boolean(),
|
|
240
|
+
openings: z.array(PluginEnclosureOpening),
|
|
241
|
+
})
|
|
242
|
+
export type PluginEnclosureSurface = z.infer<typeof PluginEnclosureSurface>
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* A space that neighbours the queried space.
|
|
246
|
+
*
|
|
247
|
+
* | Property | Type | Description |
|
|
248
|
+
* |---|---|---|
|
|
249
|
+
* | `space` | {@linkcode ComponentHandle} | The neighbouring space |
|
|
250
|
+
* | `sharedSurface` | {@linkcode ComponentHandle}` \| null` | The common boundary wall when one is found geometrically, else `null` (e.g. an open-plan or non-physical adjacency) |
|
|
251
|
+
* | `sharedEdgeLength` | `number` | Plan-unit length of the shared boundary — **always `0` in geometric v1** (the adjacency data exposes no edge length) |
|
|
252
|
+
*/
|
|
253
|
+
export const PluginAdjacentSpace = z.object({
|
|
254
|
+
space: ComponentHandle,
|
|
255
|
+
sharedSurface: ComponentHandle.nullable(),
|
|
256
|
+
sharedEdgeLength: z.number(),
|
|
257
|
+
})
|
|
258
|
+
export type PluginAdjacentSpace = z.infer<typeof PluginAdjacentSpace>
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Result of {@linkcode PluginDesignQuerySpacesApi.getEnclosure} — the geometric
|
|
262
|
+
* v1 enclosure of a space.
|
|
263
|
+
*
|
|
264
|
+
* | Property | Type | Description |
|
|
265
|
+
* |---|---|---|
|
|
266
|
+
* | `space` | {@linkcode ComponentHandle} | The queried space |
|
|
267
|
+
* | `surfaces` | {@linkcode PluginEnclosureSurface}`[]` | Floor + ceiling + bounding walls, as a flat list (any of the three may be absent when no plan match is found) |
|
|
268
|
+
* | `adjacentSpaces` | {@linkcode PluginAdjacentSpace}`[]` | Neighbouring spaces from the adjacency data (`[]` when adjacency was never computed) |
|
|
269
|
+
*/
|
|
270
|
+
export const PluginSpaceEnclosure = z.object({
|
|
271
|
+
space: ComponentHandle,
|
|
272
|
+
surfaces: z.array(PluginEnclosureSurface),
|
|
273
|
+
adjacentSpaces: z.array(PluginAdjacentSpace),
|
|
274
|
+
})
|
|
275
|
+
export type PluginSpaceEnclosure = z.infer<typeof PluginSpaceEnclosure>
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../../types"
|
|
3
|
+
import { ComponentHandle } from "../../../handles"
|
|
4
|
+
import { PluginDesignChangeResult } from "../lock"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The entity kinds {@linkcode PluginDesignSelectionApi.setByFilter} can select —
|
|
8
|
+
* the union of the editor's "Filter selection" menus (Design tab + BIM tab).
|
|
9
|
+
* Tokens mirror {@linkcode PluginEntityType} where a kind exists on the query
|
|
10
|
+
* surface; the rest are selection-only kinds the query surface cannot reach
|
|
11
|
+
* (layer-backed and annotation objects).
|
|
12
|
+
*
|
|
13
|
+
* | Value | Entity (menu label) |
|
|
14
|
+
* |---|---|
|
|
15
|
+
* | `"wall"` | Wall |
|
|
16
|
+
* | `"slab"` | Floor slab |
|
|
17
|
+
* | `"floor"` | Flooring |
|
|
18
|
+
* | `"door"` | Door |
|
|
19
|
+
* | `"window"` | Window |
|
|
20
|
+
* | `"beam"` | Beam |
|
|
21
|
+
* | `"column"` | Column |
|
|
22
|
+
* | `"ceiling"` | Ceiling |
|
|
23
|
+
* | `"roof"` | Roof |
|
|
24
|
+
* | `"staircase"` | Staircase |
|
|
25
|
+
* | `"furniture"` | Furniture |
|
|
26
|
+
* | `"pergola"` | Pergola |
|
|
27
|
+
* | `"sunshade"` | Sunshade |
|
|
28
|
+
* | `"referenceLine"` | Reference line |
|
|
29
|
+
* | `"space"` | Space (room mass) |
|
|
30
|
+
* | `"site"` | Site |
|
|
31
|
+
* | `"terrain"` | Terrain |
|
|
32
|
+
* | `"cad"` | CAD import |
|
|
33
|
+
* | `"pdf"` | PDF import |
|
|
34
|
+
* | `"image"` | Image import |
|
|
35
|
+
* | `"dimensionLine"` | Dimension line |
|
|
36
|
+
* | `"model3d"` | Imported 3D model |
|
|
37
|
+
* | `"neighborhoodBuilding"` | Neighborhood building |
|
|
38
|
+
* | `"programBlock"` | Program block (department mass) |
|
|
39
|
+
*/
|
|
40
|
+
export const PluginSelectionEntityType = z.enum([
|
|
41
|
+
"wall",
|
|
42
|
+
"slab",
|
|
43
|
+
"floor",
|
|
44
|
+
"door",
|
|
45
|
+
"window",
|
|
46
|
+
"beam",
|
|
47
|
+
"column",
|
|
48
|
+
"ceiling",
|
|
49
|
+
"roof",
|
|
50
|
+
"staircase",
|
|
51
|
+
"furniture",
|
|
52
|
+
"pergola",
|
|
53
|
+
"sunshade",
|
|
54
|
+
"referenceLine",
|
|
55
|
+
"space",
|
|
56
|
+
"site",
|
|
57
|
+
"terrain",
|
|
58
|
+
"cad",
|
|
59
|
+
"pdf",
|
|
60
|
+
"image",
|
|
61
|
+
"dimensionLine",
|
|
62
|
+
"model3d",
|
|
63
|
+
"neighborhoodBuilding",
|
|
64
|
+
"programBlock",
|
|
65
|
+
])
|
|
66
|
+
export type PluginSelectionEntityType = z.infer<typeof PluginSelectionEntityType>
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* The filter for {@linkcode PluginDesignSelectionApi.setByFilter}. At least one
|
|
70
|
+
* field must be non-empty (to empty the selection use
|
|
71
|
+
* {@linkcode PluginDesignSelectionApi.clear}). Fields **AND**-combine; values
|
|
72
|
+
* within a field **OR**-combine — `{ storeys: [2], types: ["furniture"] }`
|
|
73
|
+
* selects only the furniture on storey 2.
|
|
74
|
+
*
|
|
75
|
+
* | Field | Type | Selects entities where |
|
|
76
|
+
* |---|---|---|
|
|
77
|
+
* | `storeys` | `number[]` | storey/floor level ∈ `storeys` (negative = basement) |
|
|
78
|
+
* | `types` | {@linkcode PluginSelectionEntityType}`[]` | entity kind ∈ `types` |
|
|
79
|
+
*/
|
|
80
|
+
export const PluginSelectionFilter = z
|
|
81
|
+
.object({
|
|
82
|
+
storeys: z.array(z.number()).optional(),
|
|
83
|
+
types: z.array(PluginSelectionEntityType).optional(),
|
|
84
|
+
})
|
|
85
|
+
.refine((f) => (f.storeys?.length ?? 0) + (f.types?.length ?? 0) > 0, {
|
|
86
|
+
message:
|
|
87
|
+
"PluginSelectionFilter requires at least one non-empty field (storeys or types); use design.selection.clear() to deselect everything",
|
|
88
|
+
})
|
|
89
|
+
export type PluginSelectionFilter = z.infer<typeof PluginSelectionFilter>
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* `snaptrude.design.selection` — read and mutate the current scene selection.
|
|
93
|
+
*
|
|
94
|
+
* Selection targets are {@linkcode ComponentHandle}s. `get` is the one sanctioned
|
|
95
|
+
* `get`-returns-array accessor (§4.1(3)). The mutators (`set`/`add`/`remove`/`clear`)
|
|
96
|
+
* change the live selection and return the resulting selection snapshot — they are
|
|
97
|
+
* **not undoable** (the engine fires a selection listener, no command), so the
|
|
98
|
+
* returned {@linkcode PluginDesignChangeResult} is a committed-state snapshot.
|
|
99
|
+
*/
|
|
100
|
+
export abstract class PluginDesignSelectionApi {
|
|
101
|
+
constructor() {}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Read the current scene selection — the entities the user (or a previous
|
|
105
|
+
* call) has selected, returned as handles you can pass straight into other
|
|
106
|
+
* API calls.
|
|
107
|
+
*
|
|
108
|
+
* @returns The selection as {@linkcode ComponentHandle}`[]` (`[]` when nothing is selected)
|
|
109
|
+
*
|
|
110
|
+
* @examplePrompt What do I have selected right now?
|
|
111
|
+
* @examplePrompt List the currently selected objects
|
|
112
|
+
* @examplePrompt Which rooms are selected in the scene?
|
|
113
|
+
* @examplePrompt Get the ids of everything I've selected
|
|
114
|
+
* @examplePrompt Is anything selected?
|
|
115
|
+
*
|
|
116
|
+
* # Example
|
|
117
|
+
* ```ts
|
|
118
|
+
* // Selection handles feed straight into other API calls
|
|
119
|
+
* const selection = await snaptrude.design.selection.get()
|
|
120
|
+
* if (selection.length > 0) {
|
|
121
|
+
* const props = await snaptrude.design.query.getProperties(selection[0])
|
|
122
|
+
* }
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
public abstract get(): PluginApiReturn<ComponentHandle[]>
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Replace the selection with exactly the given entities — anything
|
|
129
|
+
* previously selected is deselected first, so afterwards only these
|
|
130
|
+
* entities are selected.
|
|
131
|
+
*
|
|
132
|
+
* @param components The entities to select
|
|
133
|
+
* @returns The resulting selection snapshot
|
|
134
|
+
*
|
|
135
|
+
* @examplePrompt Select these three walls
|
|
136
|
+
* @examplePrompt Select only the kitchen and deselect everything else
|
|
137
|
+
* @examplePrompt Change the selection to just these rooms
|
|
138
|
+
* @examplePrompt Highlight the spaces on the second storey
|
|
139
|
+
*
|
|
140
|
+
* # Example
|
|
141
|
+
* ```ts
|
|
142
|
+
* // Select only the ground-storey walls (replaces the previous selection)
|
|
143
|
+
* const walls = await snaptrude.design.query.listWalls({ storeys: [1] })
|
|
144
|
+
* const { affected } = await snaptrude.design.selection.set(walls)
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
public abstract set(components: ComponentHandle[]): PluginApiReturn<PluginDesignChangeResult>
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Add entities to the current selection without deselecting anything — the
|
|
151
|
+
* selection grows to include the given entities alongside whatever was
|
|
152
|
+
* already selected.
|
|
153
|
+
*
|
|
154
|
+
* @param components The entities to add to the selection
|
|
155
|
+
* @returns The resulting selection snapshot
|
|
156
|
+
*
|
|
157
|
+
* @examplePrompt Add the corridor to my current selection
|
|
158
|
+
* @examplePrompt Select these columns too, keeping what's already selected
|
|
159
|
+
* @examplePrompt Also select the roof
|
|
160
|
+
* @examplePrompt Extend the selection to include all the doors on this floor
|
|
161
|
+
*
|
|
162
|
+
* # Example
|
|
163
|
+
* ```ts
|
|
164
|
+
* // Grow the selection to include every roof, keeping what's already selected
|
|
165
|
+
* const roofs = await snaptrude.design.query.listRoofs()
|
|
166
|
+
* await snaptrude.design.selection.add(roofs)
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
public abstract add(components: ComponentHandle[]): PluginApiReturn<PluginDesignChangeResult>
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Remove entities from the current selection — the given entities are
|
|
173
|
+
* deselected while everything else stays selected.
|
|
174
|
+
*
|
|
175
|
+
* @param components The entities to remove from the selection
|
|
176
|
+
* @returns The resulting selection snapshot
|
|
177
|
+
*
|
|
178
|
+
* @examplePrompt Deselect the stair core but keep the rest selected
|
|
179
|
+
* @examplePrompt Remove these walls from my selection
|
|
180
|
+
* @examplePrompt Take the furniture out of the current selection
|
|
181
|
+
* @examplePrompt Unselect the two smaller rooms
|
|
182
|
+
*
|
|
183
|
+
* # Example
|
|
184
|
+
* ```ts
|
|
185
|
+
* // Deselect the furniture while keeping everything else selected
|
|
186
|
+
* const furniture = await snaptrude.design.query.listFurniture({ isSelected: true })
|
|
187
|
+
* await snaptrude.design.selection.remove(furniture)
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
public abstract remove(
|
|
191
|
+
components: ComponentHandle[]
|
|
192
|
+
): PluginApiReturn<PluginDesignChangeResult>
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Clear the selection so nothing is selected (equivalent to `set([])`).
|
|
196
|
+
*
|
|
197
|
+
* @returns The resulting (empty) selection snapshot
|
|
198
|
+
*
|
|
199
|
+
* @examplePrompt Deselect everything
|
|
200
|
+
* @examplePrompt Clear my current selection
|
|
201
|
+
* @examplePrompt Unselect all objects in the scene
|
|
202
|
+
* @examplePrompt Make sure nothing is selected before we start
|
|
203
|
+
*
|
|
204
|
+
* # Example
|
|
205
|
+
* ```ts
|
|
206
|
+
* const { affected } = await snaptrude.design.selection.clear()
|
|
207
|
+
* // affected is the resulting selection — always [] here
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
public abstract clear(): PluginApiReturn<PluginDesignChangeResult>
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Replace the selection with every visible entity of the active building that
|
|
214
|
+
* matches the filter — the programmatic equivalent of the editor's
|
|
215
|
+
* **Story selection** (`storeys`) and **Filter selection** (`types`) menus
|
|
216
|
+
* under the select tool, including their combination (fields AND, values
|
|
217
|
+
* within a field OR). Reaches selection-only kinds the query surface cannot
|
|
218
|
+
* (sites, terrain, CAD/PDF/image imports, dimension lines, 3D models,
|
|
219
|
+
* neighborhood buildings) and selects whole groups the way the editor does.
|
|
220
|
+
*
|
|
221
|
+
* This is a one-shot bulk select, not a persistent mode: the user's next
|
|
222
|
+
* canvas click resets the underlying filter state (the selection it made
|
|
223
|
+
* stays until changed). Results honor the ambient view — active building,
|
|
224
|
+
* hidden objects/buckets, and in 2D the active storey.
|
|
225
|
+
*
|
|
226
|
+
* @param filter Which entities to select — {@linkcode PluginSelectionFilter};
|
|
227
|
+
* at least one field must be non-empty
|
|
228
|
+
* @returns The resulting selection snapshot
|
|
229
|
+
*
|
|
230
|
+
* @examplePrompt Select everything on storey 2
|
|
231
|
+
* @examplePrompt Select all the walls and doors
|
|
232
|
+
* @examplePrompt Story selection: select the ground floor and first floor
|
|
233
|
+
* @examplePrompt Filter selection: select all furniture in the model
|
|
234
|
+
* @examplePrompt Select only the furniture on the second storey
|
|
235
|
+
* @examplePrompt Select all the spaces so I can recolor them
|
|
236
|
+
*
|
|
237
|
+
* # Example
|
|
238
|
+
* ```ts
|
|
239
|
+
* // "Story selection": everything on storeys 1 and 2
|
|
240
|
+
* await snaptrude.design.selection.setByFilter({ storeys: [1, 2] })
|
|
241
|
+
*
|
|
242
|
+
* // "Filter selection": all walls and doors
|
|
243
|
+
* await snaptrude.design.selection.setByFilter({ types: ["wall", "door"] })
|
|
244
|
+
*
|
|
245
|
+
* // Combined: only the furniture on storey 2
|
|
246
|
+
* const { affected } = await snaptrude.design.selection.setByFilter({
|
|
247
|
+
* storeys: [2],
|
|
248
|
+
* types: ["furniture"],
|
|
249
|
+
* })
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
public abstract setByFilter(
|
|
253
|
+
filter: PluginSelectionFilter
|
|
254
|
+
): PluginApiReturn<PluginDesignChangeResult>
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Arguments for {@linkcode PluginDesignSelectionApi.set}.
|
|
259
|
+
*
|
|
260
|
+
* | Property | Type | Description |
|
|
261
|
+
* |---|---|---|
|
|
262
|
+
* | `components` | {@linkcode ComponentHandle}`[]` | The entities to select |
|
|
263
|
+
*/
|
|
264
|
+
export const PluginDesignSelectionSetArgs = z.object({
|
|
265
|
+
components: z.array(ComponentHandle),
|
|
266
|
+
})
|
|
267
|
+
export type PluginDesignSelectionSetArgs = z.infer<typeof PluginDesignSelectionSetArgs>
|
|
268
|
+
|
|
269
|
+
export const PluginDesignSelectionAddArgs = PluginDesignSelectionSetArgs
|
|
270
|
+
export type PluginDesignSelectionAddArgs = z.infer<typeof PluginDesignSelectionAddArgs>
|
|
271
|
+
|
|
272
|
+
export const PluginDesignSelectionRemoveArgs = PluginDesignSelectionSetArgs
|
|
273
|
+
export type PluginDesignSelectionRemoveArgs = z.infer<typeof PluginDesignSelectionRemoveArgs>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { ComponentHandle } from "../../handles"
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Shared `design.*` operation return records (LLD Part A.3).
|
|
6
|
+
*
|
|
7
|
+
* `PluginDesignChangeResult` (`{ affected }`) is NOT here — it already lives in
|
|
8
|
+
* `./lock` and is reused verbatim by the transform/delete mutators.
|
|
9
|
+
*
|
|
10
|
+
* NOTE: `PluginMirrorAxis` currently lives in `./doors`; its relocation into this
|
|
11
|
+
* shared module is deferred to the transform wave (avoids a doors edit + a
|
|
12
|
+
* double-export while `design.transform` is unwired).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Result of a CSG boolean op (`design.boolean.union/subtract/intersect`). Grounded
|
|
17
|
+
* in the engine `Boolean3dOperation.resultComponents { toCreate; toDelete }`:
|
|
18
|
+
* `created` are the result masses, `deleted` is every consumed input (for
|
|
19
|
+
* `subtract` this includes BOTH the target AND the tools). Errors throw (RPC
|
|
20
|
+
* rejects); no `Result<>` crosses the boundary.
|
|
21
|
+
*/
|
|
22
|
+
export const BooleanOutcome = z.object({
|
|
23
|
+
created: z.array(ComponentHandle),
|
|
24
|
+
deleted: z.array(ComponentHandle),
|
|
25
|
+
})
|
|
26
|
+
export type BooleanOutcome = z.infer<typeof BooleanOutcome>
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Result of `design.edit.offsetSplit` (migrated from `tools.offset`). `createdIds`
|
|
30
|
+
* are the components the offset produced; `deletedIds` are those a split-style
|
|
31
|
+
* offset removed. `offsetValue` is the engine's POST-clamp / post-sign applied
|
|
32
|
+
* distance — the only way a caller learns the actually-applied clamped distance
|
|
33
|
+
* (the shipped `tools.offset` result dropped it).
|
|
34
|
+
*/
|
|
35
|
+
export const OffsetSplitOutcome = z.object({
|
|
36
|
+
createdIds: z.array(ComponentHandle),
|
|
37
|
+
deletedIds: z.array(ComponentHandle),
|
|
38
|
+
offsetValue: z.number(),
|
|
39
|
+
})
|
|
40
|
+
export type OffsetSplitOutcome = z.infer<typeof OffsetSplitOutcome>
|