@snaptrude/plugin-core 0.9.16 → 0.9.18-networks-20261016.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +231 -231
- package/CHANGELOG.md +408 -402
- package/CLAUDE.md +11 -11
- package/dist/api/analysis/daylight.d.ts +5 -5
- package/dist/api/analysis/solar.d.ts +2 -2
- package/dist/api/core/camera/index.d.ts +29 -0
- package/dist/api/core/camera/index.d.ts.map +1 -1
- package/dist/api/core/geom/create/index.d.ts +7 -1
- package/dist/api/core/geom/create/index.d.ts.map +1 -1
- package/dist/api/core/geom/update/contour.d.ts +8 -2
- package/dist/api/core/geom/update/contour.d.ts.map +1 -1
- package/dist/api/core/zoom/index.d.ts +13 -0
- package/dist/api/core/zoom/index.d.ts.map +1 -1
- package/dist/api/design/bim.d.ts +209 -0
- package/dist/api/design/bim.d.ts.map +1 -0
- package/dist/api/design/boolean/index.d.ts +2 -0
- package/dist/api/design/boolean/index.d.ts.map +1 -1
- package/dist/api/design/catalog.d.ts +320 -0
- package/dist/api/design/catalog.d.ts.map +1 -0
- package/dist/api/design/create/bulk-items.d.ts +65 -25
- package/dist/api/design/create/bulk-items.d.ts.map +1 -1
- package/dist/api/design/create/index.d.ts +272 -99
- package/dist/api/design/create/index.d.ts.map +1 -1
- package/dist/api/design/create/opening-fields.d.ts +13 -12
- package/dist/api/design/create/opening-fields.d.ts.map +1 -1
- package/dist/api/design/delete/index.d.ts +1 -0
- package/dist/api/design/delete/index.d.ts.map +1 -1
- package/dist/api/design/doors/index.d.ts +18 -24
- package/dist/api/design/doors/index.d.ts.map +1 -1
- package/dist/api/design/family.d.ts +797 -27
- package/dist/api/design/family.d.ts.map +1 -1
- package/dist/api/design/index.d.ts +16 -0
- package/dist/api/design/index.d.ts.map +1 -1
- package/dist/api/design/networks.d.ts +1763 -0
- package/dist/api/design/networks.d.ts.map +1 -0
- package/dist/api/design/query/index.d.ts +42 -32
- package/dist/api/design/query/index.d.ts.map +1 -1
- package/dist/api/design/selection/index.d.ts +10 -10
- package/dist/api/design/types/index.d.ts +40 -24
- package/dist/api/design/types/index.d.ts.map +1 -1
- package/dist/api/design/update/index.d.ts +43 -3
- package/dist/api/design/update/index.d.ts.map +1 -1
- package/dist/api/design/windows/index.d.ts +8 -8
- package/dist/api/design/windows/index.d.ts.map +1 -1
- package/dist/api/presentation/aiInspiration.d.ts +10 -10
- package/dist/api/presentation/annotate.d.ts +38 -22
- package/dist/api/presentation/annotate.d.ts.map +1 -1
- package/dist/api/presentation/drawingContract.d.ts +32 -0
- package/dist/api/presentation/drawingContract.d.ts.map +1 -0
- package/dist/api/presentation/drawings.d.ts +3523 -0
- package/dist/api/presentation/drawings.d.ts.map +1 -0
- package/dist/api/presentation/export.d.ts +23 -5
- package/dist/api/presentation/export.d.ts.map +1 -1
- package/dist/api/presentation/index.d.ts +41 -12
- package/dist/api/presentation/index.d.ts.map +1 -1
- package/dist/api/presentation/placedViews.d.ts +106 -6
- package/dist/api/presentation/placedViews.d.ts.map +1 -1
- package/dist/api/presentation/sections.d.ts +461 -0
- package/dist/api/presentation/sections.d.ts.map +1 -0
- package/dist/api/presentation/shapes.d.ts +2 -2
- package/dist/api/presentation/sheets.d.ts +175 -19
- package/dist/api/presentation/sheets.d.ts.map +1 -1
- package/dist/api/presentation/viewPresets.d.ts +222 -0
- package/dist/api/presentation/viewPresets.d.ts.map +1 -0
- package/dist/api/presentation/views.d.ts +103 -5
- package/dist/api/presentation/views.d.ts.map +1 -1
- package/dist/api/presentation/walkthroughs.d.ts +6 -6
- package/dist/errors/codes.d.ts +3 -1
- package/dist/errors/codes.d.ts.map +1 -1
- package/dist/index.cjs +3788 -2328
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3650 -2328
- package/dist/index.js.map +1 -1
- package/package.json +42 -42
- package/scripts/check-dist-fresh.mjs +22 -22
- package/scripts/generate-manifest.mjs +243 -238
- package/scripts/generate-manifest.test.mjs +303 -303
- package/src/api/analysis/daylight.ts +470 -470
- package/src/api/analysis/heatmaps.ts +683 -683
- package/src/api/analysis/illuminance.ts +155 -155
- package/src/api/analysis/index.ts +61 -61
- package/src/api/analysis/shadows.ts +183 -183
- package/src/api/analysis/solar.ts +237 -237
- package/src/api/analysis/sunlightHours.ts +211 -211
- package/src/api/analysis/sunpath.ts +83 -83
- package/src/api/analysis/weather.ts +179 -179
- package/src/api/core/buildings.ts +485 -485
- package/src/api/core/camera/index.ts +696 -667
- package/src/api/core/comment/index.ts +376 -376
- package/src/api/core/geom/create/index.ts +2139 -2133
- package/src/api/core/geom/delete/index.ts +84 -84
- package/src/api/core/geom/index.ts +35 -35
- package/src/api/core/geom/query/arc.ts +169 -169
- package/src/api/core/geom/query/brep.ts +621 -621
- package/src/api/core/geom/query/circle.ts +404 -404
- package/src/api/core/geom/query/contour.ts +540 -540
- package/src/api/core/geom/query/curve.ts +1102 -1102
- package/src/api/core/geom/query/edge.ts +130 -130
- package/src/api/core/geom/query/face.ts +508 -508
- package/src/api/core/geom/query/halfedge.ts +210 -210
- package/src/api/core/geom/query/index.ts +63 -63
- package/src/api/core/geom/query/profile.ts +473 -473
- package/src/api/core/geom/query/vertex.ts +205 -205
- package/src/api/core/geom/update/contour.ts +323 -317
- package/src/api/core/geom/update/curve.ts +209 -209
- package/src/api/core/geom/update/index.ts +29 -29
- package/src/api/core/geom/update/profile.ts +379 -379
- package/src/api/core/groups.ts +521 -521
- package/src/api/core/handles/index.ts +234 -234
- package/src/api/core/history/index.ts +84 -84
- package/src/api/core/index.ts +99 -99
- package/src/api/core/io/export/index.ts +126 -126
- package/src/api/core/io/import/index.ts +504 -504
- package/src/api/core/io/index.ts +42 -42
- package/src/api/core/io/job/index.ts +140 -140
- package/src/api/core/io/query/index.ts +71 -71
- package/src/api/core/io/terrain/index.ts +360 -360
- package/src/api/core/io/underlay/index.ts +705 -705
- package/src/api/core/layers.ts +540 -540
- package/src/api/core/math/index.ts +20 -20
- package/src/api/core/math/quat.ts +172 -172
- package/src/api/core/math/vec3.ts +179 -179
- package/src/api/core/mode/index.ts +108 -108
- package/src/api/core/project/index.ts +479 -479
- package/src/api/core/proposals/index.ts +570 -570
- package/src/api/core/storeys/index.ts +308 -308
- package/src/api/core/storeys/layers.ts +339 -339
- package/src/api/core/tags.ts +911 -911
- package/src/api/core/units/index.ts +164 -164
- package/src/api/core/user.ts +46 -46
- package/src/api/core/zoom/index.ts +64 -51
- package/src/api/design/bim.ts +121 -0
- package/src/api/design/boolean/index.ts +181 -179
- package/src/api/design/catalog.ts +203 -0
- package/src/api/design/create/bulk-items.ts +294 -254
- package/src/api/design/create/grids.ts +137 -137
- package/src/api/design/create/index.ts +2148 -1980
- package/src/api/design/create/opening-fields.ts +40 -37
- package/src/api/design/delete/index.ts +75 -74
- package/src/api/design/dimensions.ts +453 -453
- package/src/api/design/doors/index.ts +516 -500
- package/src/api/design/edit/index.ts +54 -54
- package/src/api/design/erase/index.ts +151 -151
- package/src/api/design/family.ts +1334 -704
- package/src/api/design/furniture/index.ts +319 -319
- package/src/api/design/grids.ts +237 -237
- package/src/api/design/index.ts +304 -274
- package/src/api/design/lock.ts +69 -69
- package/src/api/design/materials/index.ts +608 -608
- package/src/api/design/networks.ts +667 -0
- package/src/api/design/query/geometry/index.ts +319 -319
- package/src/api/design/query/grids.ts +197 -197
- package/src/api/design/query/index.ts +1236 -1226
- package/src/api/design/query/referenceLines.ts +52 -52
- package/src/api/design/query/spaces.ts +275 -275
- package/src/api/design/selection/index.ts +273 -273
- package/src/api/design/shared.ts +40 -40
- package/src/api/design/transform/index.ts +254 -254
- package/src/api/design/types/index.ts +163 -156
- package/src/api/design/update/index.ts +1024 -983
- package/src/api/design/visibility.ts +143 -143
- package/src/api/design/windows/index.ts +351 -333
- package/src/api/entity/buildableEnvelope.ts +322 -322
- package/src/api/entity/index.ts +30 -30
- package/src/api/entity/referenceLine.ts +235 -235
- package/src/api/entity/space.ts +612 -612
- package/src/api/entity/story.ts +517 -517
- package/src/api/index.ts +47 -47
- package/src/api/presentation/aiInspiration.ts +1116 -1116
- package/src/api/presentation/annotate.ts +417 -385
- package/src/api/presentation/camera.ts +289 -289
- package/src/api/presentation/diagrams.ts +194 -194
- package/src/api/presentation/drawingContract.ts +70 -0
- package/src/api/presentation/drawings.ts +1179 -0
- package/src/api/presentation/export.ts +134 -108
- package/src/api/presentation/import.ts +159 -159
- package/src/api/presentation/index.ts +160 -126
- package/src/api/presentation/placedViews.ts +1211 -1120
- package/src/api/presentation/sections.ts +420 -0
- package/src/api/presentation/shapes.ts +274 -274
- package/src/api/presentation/sheets.ts +746 -585
- package/src/api/presentation/slideshow.ts +134 -134
- package/src/api/presentation/tables.ts +84 -84
- package/src/api/presentation/viewPresets.ts +241 -0
- package/src/api/presentation/views.ts +713 -673
- package/src/api/presentation/walkthroughs.ts +1201 -1201
- package/src/api/program/adjacency.ts +164 -164
- package/src/api/program/areas.ts +408 -408
- package/src/api/program/classification.ts +138 -138
- package/src/api/program/cores.ts +83 -83
- package/src/api/program/departments.ts +517 -517
- package/src/api/program/index.ts +73 -73
- package/src/api/program/labels.ts +332 -332
- package/src/api/program/layout.ts +422 -422
- package/src/api/program/metadata.ts +364 -364
- package/src/api/program/metrics.ts +120 -120
- package/src/api/program/site.ts +748 -748
- package/src/api/program/spreadsheet.ts +2698 -2698
- package/src/api/workspace/index.ts +612 -612
- package/src/errors/codes.ts +143 -136
- package/src/errors/envelope.ts +75 -75
- package/src/errors/index.ts +21 -21
- package/src/errors/plugin-error.ts +134 -134
- package/src/handles.ts +297 -297
- package/src/host-utils.ts +67 -67
- package/src/index.ts +7 -7
- package/src/massParameters.ops.ts +246 -246
- package/src/massParameters.ts +427 -427
- package/src/types.ts +16 -16
- package/test/drawingContract.test.mjs +288 -0
- package/test/errors.test.mjs +185 -184
- package/test/massParameters.test.mjs +952 -952
- package/tsconfig.json +22 -22
- package/tsup.config.ts +12 -12
- package/api-manifest.json +0 -9618
package/src/api/design/grids.ts
CHANGED
|
@@ -1,237 +1,237 @@
|
|
|
1
|
-
import * as z from "zod"
|
|
2
|
-
import { PluginApiReturn } from "../../types"
|
|
3
|
-
import { ComponentHandle } from "../../handles"
|
|
4
|
-
import { PluginGridStyleOptions } from "./create/grids"
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Tag policy for structural line removal (mirrors the engine
|
|
8
|
-
* `GridLineTagPolicy` values verbatim): `"rewrite"` renumbers each affected
|
|
9
|
-
* wing's tag sequence after removal; `"preserve"` keeps the surviving lines'
|
|
10
|
-
* tags unchanged.
|
|
11
|
-
*/
|
|
12
|
-
export const PluginGridLineTagPolicy = z.enum(["rewrite", "preserve"])
|
|
13
|
-
export type PluginGridLineTagPolicy = z.infer<typeof PluginGridLineTagPolicy>
|
|
14
|
-
|
|
15
|
-
/** A positional grid-line address — indices into `design.query.grids.get`'s `wings` arrays. */
|
|
16
|
-
export const PluginGridLineAddress = z.object({
|
|
17
|
-
wing: z.number().int().nonnegative(),
|
|
18
|
-
line: z.number().int().nonnegative(),
|
|
19
|
-
})
|
|
20
|
-
export type PluginGridLineAddress = z.infer<typeof PluginGridLineAddress>
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* One per-wing entry of {@linkcode PluginDesignGridsApi.updateWings} —
|
|
24
|
-
* addressed by wing index. `spanMin`/`spanMax` move the family's length
|
|
25
|
-
* handles (Snaptrude units).
|
|
26
|
-
*/
|
|
27
|
-
export const PluginGridWingEntry = z.object({
|
|
28
|
-
wing: z.number().int().nonnegative(),
|
|
29
|
-
spacing: z.number().positive().finite().optional(),
|
|
30
|
-
count: z.number().int().min(1).optional(),
|
|
31
|
-
spanMin: z.number().finite().optional(),
|
|
32
|
-
spanMax: z.number().finite().optional(),
|
|
33
|
-
})
|
|
34
|
-
export type PluginGridWingEntry = z.infer<typeof PluginGridWingEntry>
|
|
35
|
-
|
|
36
|
-
/** Arguments for {@linkcode PluginDesignGridsApi.updateWings}. */
|
|
37
|
-
export const PluginDesignGridsUpdateWingsArgs = z.object({
|
|
38
|
-
grid: ComponentHandle,
|
|
39
|
-
wings: z.array(PluginGridWingEntry).min(1),
|
|
40
|
-
})
|
|
41
|
-
export type PluginDesignGridsUpdateWingsArgs = z.infer<
|
|
42
|
-
typeof PluginDesignGridsUpdateWingsArgs
|
|
43
|
-
>
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* One per-line entry of {@linkcode PluginDesignGridsApi.updateLines} —
|
|
47
|
-
* addressed positionally by `{ wing, line }` indices (invalidated by
|
|
48
|
-
* structural edits; re-query after mutating). `distanceToPrevious` /
|
|
49
|
-
* `distanceToNext` set the typed distance to the adjacent line on that side
|
|
50
|
-
* and are mutually exclusive.
|
|
51
|
-
*
|
|
52
|
-
* `visible` is **hide-only** (`false`), mirroring the product: per-line show
|
|
53
|
-
* does not exist — showing the GROUP (`design.visibility.show`) restores all
|
|
54
|
-
* of its lines, exactly like the native Show All.
|
|
55
|
-
*/
|
|
56
|
-
export const PluginGridLineEntry = z
|
|
57
|
-
.object({
|
|
58
|
-
wing: z.number().int().nonnegative(),
|
|
59
|
-
line: z.number().int().nonnegative(),
|
|
60
|
-
tag: z.string().min(1).optional(),
|
|
61
|
-
distanceToPrevious: z.number().positive().finite().optional(),
|
|
62
|
-
distanceToNext: z.number().positive().finite().optional(),
|
|
63
|
-
props: PluginGridStyleOptions.optional(),
|
|
64
|
-
visible: z.literal(false).optional(),
|
|
65
|
-
})
|
|
66
|
-
.superRefine((entry, ctx) => {
|
|
67
|
-
if (entry.distanceToPrevious !== undefined && entry.distanceToNext !== undefined) {
|
|
68
|
-
ctx.addIssue({
|
|
69
|
-
code: z.ZodIssueCode.custom,
|
|
70
|
-
message:
|
|
71
|
-
"distanceToPrevious and distanceToNext are mutually exclusive on one line entry",
|
|
72
|
-
})
|
|
73
|
-
}
|
|
74
|
-
})
|
|
75
|
-
export type PluginGridLineEntry = z.infer<typeof PluginGridLineEntry>
|
|
76
|
-
|
|
77
|
-
/** Arguments for {@linkcode PluginDesignGridsApi.updateLines}. */
|
|
78
|
-
export const PluginDesignGridsUpdateLinesArgs = z.object({
|
|
79
|
-
grid: ComponentHandle,
|
|
80
|
-
lines: z.array(PluginGridLineEntry).min(1),
|
|
81
|
-
})
|
|
82
|
-
export type PluginDesignGridsUpdateLinesArgs = z.infer<
|
|
83
|
-
typeof PluginDesignGridsUpdateLinesArgs
|
|
84
|
-
>
|
|
85
|
-
|
|
86
|
-
/** Arguments for {@linkcode PluginDesignGridsApi.addLine}. */
|
|
87
|
-
export const PluginDesignGridsAddLineArgs = z.object({
|
|
88
|
-
grid: ComponentHandle,
|
|
89
|
-
wing: z.number().int().nonnegative(),
|
|
90
|
-
position: z.number().finite(),
|
|
91
|
-
})
|
|
92
|
-
export type PluginDesignGridsAddLineArgs = z.infer<typeof PluginDesignGridsAddLineArgs>
|
|
93
|
-
|
|
94
|
-
/** Arguments for {@linkcode PluginDesignGridsApi.removeLines}. */
|
|
95
|
-
export const PluginDesignGridsRemoveLinesArgs = z.object({
|
|
96
|
-
grid: ComponentHandle,
|
|
97
|
-
lines: z.array(PluginGridLineAddress).min(1),
|
|
98
|
-
tagPolicy: PluginGridLineTagPolicy.optional(),
|
|
99
|
-
})
|
|
100
|
-
export type PluginDesignGridsRemoveLinesArgs = z.infer<
|
|
101
|
-
typeof PluginDesignGridsRemoveLinesArgs
|
|
102
|
-
>
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* `design.grids.*` — structural edits on a grid's line structure (the
|
|
106
|
-
* entity-family home for grid-specific operations, like `design.doors`).
|
|
107
|
-
*
|
|
108
|
-
* Lines are addressed positionally as `{ wing, line }` index pairs into the
|
|
109
|
-
* `wings` arrays returned by `design.query.grids.get`. Adding, removing, or
|
|
110
|
-
* re-counting lines re-indexes the wing — re-query after every structural edit.
|
|
111
|
-
*
|
|
112
|
-
* Group-level edits (default styling, angle, storey visibility) live on
|
|
113
|
-
* `design.update.grid`; creation lives on `design.create.grid*`.
|
|
114
|
-
*
|
|
115
|
-
* Accessed via `snaptrude.design.grids`.
|
|
116
|
-
*/
|
|
117
|
-
export abstract class PluginDesignGridsApi {
|
|
118
|
-
constructor() {}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Update one or more **wings** of a grid with sparse per-wing entries —
|
|
122
|
-
* `spacing` (uniform re-space), `count` (grow/truncate + tag renumber),
|
|
123
|
-
* `spanMin`/`spanMax` (family length handles). Every change routes through
|
|
124
|
-
* the exact setters the native panel uses — each changed field commits its
|
|
125
|
-
* own undoable command, identical to editing that field in the panel.
|
|
126
|
-
*
|
|
127
|
-
* A `count` change re-indexes the wing's lines — positional `{ wing, line }`
|
|
128
|
-
* addresses held from before the call are stale afterwards; re-query.
|
|
129
|
-
*
|
|
130
|
-
* @param grid - The grid group
|
|
131
|
-
* @param wings - Sparse {@linkcode PluginGridWingEntry} entries (≥ 1)
|
|
132
|
-
* @returns `true` once applied
|
|
133
|
-
*
|
|
134
|
-
* @examplePrompt Change this grid's spacing to 8 metres
|
|
135
|
-
* @examplePrompt Make this grid 10 by 12 lines
|
|
136
|
-
*
|
|
137
|
-
* # Example
|
|
138
|
-
* ```ts
|
|
139
|
-
* await snaptrude.design.grids.updateWings(grid, [{ wing: 0, spacing: 8, count: 10 }])
|
|
140
|
-
* ```
|
|
141
|
-
*/
|
|
142
|
-
public abstract updateWings(
|
|
143
|
-
grid: ComponentHandle,
|
|
144
|
-
wings: PluginGridWingEntry[],
|
|
145
|
-
): PluginApiReturn<boolean>
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Update one or more **lines** of a grid with sparse per-line entries —
|
|
149
|
-
* `tag`, `distanceToPrevious`/`distanceToNext` (typed distance to the
|
|
150
|
-
* neighbour on that side; mutually exclusive), `props` (per-line style
|
|
151
|
-
* overrides), and `visible: false` (hide). Every change routes through the
|
|
152
|
-
* exact setters the native panel uses — each changed field commits its own
|
|
153
|
-
* undoable command, identical to editing that field in the panel.
|
|
154
|
-
*
|
|
155
|
-
* Visibility mirrors the product exactly: `visible` accepts only `false` —
|
|
156
|
-
* per-line show does not exist. Hiding lines that would leave NO visible
|
|
157
|
-
* line hides the whole GROUP instead (the native last-line rule; those line
|
|
158
|
-
* flags stay untouched). To bring hidden lines back, show the group
|
|
159
|
-
* (`design.visibility.show([grid])`) — it restores ALL of its lines, like
|
|
160
|
-
* the native Show All.
|
|
161
|
-
*
|
|
162
|
-
* @param grid - The grid group
|
|
163
|
-
* @param lines - Sparse {@linkcode PluginGridLineEntry} entries (≥ 1)
|
|
164
|
-
* @returns `true` once applied
|
|
165
|
-
*
|
|
166
|
-
* @examplePrompt Rename grid line 2 to "B"
|
|
167
|
-
* @examplePrompt Move this grid line 4 metres from its neighbour
|
|
168
|
-
* @examplePrompt Hide grid line 3 on this grid
|
|
169
|
-
*
|
|
170
|
-
* # Example
|
|
171
|
-
* ```ts
|
|
172
|
-
* await snaptrude.design.grids.updateLines(grid, [
|
|
173
|
-
* { wing: 0, line: 1, tag: "B", distanceToPrevious: 4 },
|
|
174
|
-
* ])
|
|
175
|
-
* ```
|
|
176
|
-
*/
|
|
177
|
-
public abstract updateLines(
|
|
178
|
-
grid: ComponentHandle,
|
|
179
|
-
lines: PluginGridLineEntry[],
|
|
180
|
-
): PluginApiReturn<boolean>
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Insert a parallel grid line into a wing at an explicit position along the
|
|
184
|
-
* wing's spacing axis (Snaptrude units, wing-local — line 0's position can
|
|
185
|
-
* be read from its curve). Sibling lines do not shift; the wing's tag
|
|
186
|
-
* sequence is renumbered. Undoable.
|
|
187
|
-
*
|
|
188
|
-
* @param grid - The grid group
|
|
189
|
-
* @param wing - Wing index
|
|
190
|
-
* @param position - Position along the wing's spacing axis (Snaptrude units)
|
|
191
|
-
* @returns `true` once inserted
|
|
192
|
-
* @throws `VALIDATION` on a bad wing index or non-finite position
|
|
193
|
-
*
|
|
194
|
-
* @examplePrompt Add a grid line between lines 2 and 3
|
|
195
|
-
* @examplePrompt Insert an extra grid line 4 metres from line A
|
|
196
|
-
*
|
|
197
|
-
* # Example
|
|
198
|
-
* ```ts
|
|
199
|
-
* await snaptrude.design.grids.addLine(grid, 0, 12.5)
|
|
200
|
-
* ```
|
|
201
|
-
*/
|
|
202
|
-
public abstract addLine(
|
|
203
|
-
grid: ComponentHandle,
|
|
204
|
-
wing: number,
|
|
205
|
-
position: number,
|
|
206
|
-
): PluginApiReturn<boolean>
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Remove grid lines by positional address, as ONE undoable step. With
|
|
210
|
-
* `tagPolicy: "rewrite"` (default) each affected wing renumbers its tag
|
|
211
|
-
* sequence; `"preserve"` keeps surviving tags unchanged. A wing emptied of
|
|
212
|
-
* lines is dropped from the group.
|
|
213
|
-
*
|
|
214
|
-
* Removing EVERY line of the group is rejected — delete the group instead
|
|
215
|
-
* (`design.delete.entities`).
|
|
216
|
-
*
|
|
217
|
-
* @param grid - The grid group
|
|
218
|
-
* @param lines - Positional addresses to remove (see `design.query.grids.get`)
|
|
219
|
-
* @param tagPolicy - `"rewrite"` (default) or `"preserve"`
|
|
220
|
-
* @returns `true` once removed
|
|
221
|
-
* @throws `VALIDATION` on out-of-range addresses; `OPERATION_FAILED` when the
|
|
222
|
-
* removal would delete the group's last line
|
|
223
|
-
*
|
|
224
|
-
* @examplePrompt Delete grid line B
|
|
225
|
-
* @examplePrompt Remove the last two lines of this grid without renumbering
|
|
226
|
-
*
|
|
227
|
-
* # Example
|
|
228
|
-
* ```ts
|
|
229
|
-
* await snaptrude.design.grids.removeLines(grid, [{ wing: 0, line: 2 }], "preserve")
|
|
230
|
-
* ```
|
|
231
|
-
*/
|
|
232
|
-
public abstract removeLines(
|
|
233
|
-
grid: ComponentHandle,
|
|
234
|
-
lines: PluginGridLineAddress[],
|
|
235
|
-
tagPolicy?: PluginGridLineTagPolicy,
|
|
236
|
-
): PluginApiReturn<boolean>
|
|
237
|
-
}
|
|
1
|
+
import * as z from "zod"
|
|
2
|
+
import { PluginApiReturn } from "../../types"
|
|
3
|
+
import { ComponentHandle } from "../../handles"
|
|
4
|
+
import { PluginGridStyleOptions } from "./create/grids"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Tag policy for structural line removal (mirrors the engine
|
|
8
|
+
* `GridLineTagPolicy` values verbatim): `"rewrite"` renumbers each affected
|
|
9
|
+
* wing's tag sequence after removal; `"preserve"` keeps the surviving lines'
|
|
10
|
+
* tags unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export const PluginGridLineTagPolicy = z.enum(["rewrite", "preserve"])
|
|
13
|
+
export type PluginGridLineTagPolicy = z.infer<typeof PluginGridLineTagPolicy>
|
|
14
|
+
|
|
15
|
+
/** A positional grid-line address — indices into `design.query.grids.get`'s `wings` arrays. */
|
|
16
|
+
export const PluginGridLineAddress = z.object({
|
|
17
|
+
wing: z.number().int().nonnegative(),
|
|
18
|
+
line: z.number().int().nonnegative(),
|
|
19
|
+
})
|
|
20
|
+
export type PluginGridLineAddress = z.infer<typeof PluginGridLineAddress>
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* One per-wing entry of {@linkcode PluginDesignGridsApi.updateWings} —
|
|
24
|
+
* addressed by wing index. `spanMin`/`spanMax` move the family's length
|
|
25
|
+
* handles (Snaptrude units).
|
|
26
|
+
*/
|
|
27
|
+
export const PluginGridWingEntry = z.object({
|
|
28
|
+
wing: z.number().int().nonnegative(),
|
|
29
|
+
spacing: z.number().positive().finite().optional(),
|
|
30
|
+
count: z.number().int().min(1).optional(),
|
|
31
|
+
spanMin: z.number().finite().optional(),
|
|
32
|
+
spanMax: z.number().finite().optional(),
|
|
33
|
+
})
|
|
34
|
+
export type PluginGridWingEntry = z.infer<typeof PluginGridWingEntry>
|
|
35
|
+
|
|
36
|
+
/** Arguments for {@linkcode PluginDesignGridsApi.updateWings}. */
|
|
37
|
+
export const PluginDesignGridsUpdateWingsArgs = z.object({
|
|
38
|
+
grid: ComponentHandle,
|
|
39
|
+
wings: z.array(PluginGridWingEntry).min(1),
|
|
40
|
+
})
|
|
41
|
+
export type PluginDesignGridsUpdateWingsArgs = z.infer<
|
|
42
|
+
typeof PluginDesignGridsUpdateWingsArgs
|
|
43
|
+
>
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* One per-line entry of {@linkcode PluginDesignGridsApi.updateLines} —
|
|
47
|
+
* addressed positionally by `{ wing, line }` indices (invalidated by
|
|
48
|
+
* structural edits; re-query after mutating). `distanceToPrevious` /
|
|
49
|
+
* `distanceToNext` set the typed distance to the adjacent line on that side
|
|
50
|
+
* and are mutually exclusive.
|
|
51
|
+
*
|
|
52
|
+
* `visible` is **hide-only** (`false`), mirroring the product: per-line show
|
|
53
|
+
* does not exist — showing the GROUP (`design.visibility.show`) restores all
|
|
54
|
+
* of its lines, exactly like the native Show All.
|
|
55
|
+
*/
|
|
56
|
+
export const PluginGridLineEntry = z
|
|
57
|
+
.object({
|
|
58
|
+
wing: z.number().int().nonnegative(),
|
|
59
|
+
line: z.number().int().nonnegative(),
|
|
60
|
+
tag: z.string().min(1).optional(),
|
|
61
|
+
distanceToPrevious: z.number().positive().finite().optional(),
|
|
62
|
+
distanceToNext: z.number().positive().finite().optional(),
|
|
63
|
+
props: PluginGridStyleOptions.optional(),
|
|
64
|
+
visible: z.literal(false).optional(),
|
|
65
|
+
})
|
|
66
|
+
.superRefine((entry, ctx) => {
|
|
67
|
+
if (entry.distanceToPrevious !== undefined && entry.distanceToNext !== undefined) {
|
|
68
|
+
ctx.addIssue({
|
|
69
|
+
code: z.ZodIssueCode.custom,
|
|
70
|
+
message:
|
|
71
|
+
"distanceToPrevious and distanceToNext are mutually exclusive on one line entry",
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
export type PluginGridLineEntry = z.infer<typeof PluginGridLineEntry>
|
|
76
|
+
|
|
77
|
+
/** Arguments for {@linkcode PluginDesignGridsApi.updateLines}. */
|
|
78
|
+
export const PluginDesignGridsUpdateLinesArgs = z.object({
|
|
79
|
+
grid: ComponentHandle,
|
|
80
|
+
lines: z.array(PluginGridLineEntry).min(1),
|
|
81
|
+
})
|
|
82
|
+
export type PluginDesignGridsUpdateLinesArgs = z.infer<
|
|
83
|
+
typeof PluginDesignGridsUpdateLinesArgs
|
|
84
|
+
>
|
|
85
|
+
|
|
86
|
+
/** Arguments for {@linkcode PluginDesignGridsApi.addLine}. */
|
|
87
|
+
export const PluginDesignGridsAddLineArgs = z.object({
|
|
88
|
+
grid: ComponentHandle,
|
|
89
|
+
wing: z.number().int().nonnegative(),
|
|
90
|
+
position: z.number().finite(),
|
|
91
|
+
})
|
|
92
|
+
export type PluginDesignGridsAddLineArgs = z.infer<typeof PluginDesignGridsAddLineArgs>
|
|
93
|
+
|
|
94
|
+
/** Arguments for {@linkcode PluginDesignGridsApi.removeLines}. */
|
|
95
|
+
export const PluginDesignGridsRemoveLinesArgs = z.object({
|
|
96
|
+
grid: ComponentHandle,
|
|
97
|
+
lines: z.array(PluginGridLineAddress).min(1),
|
|
98
|
+
tagPolicy: PluginGridLineTagPolicy.optional(),
|
|
99
|
+
})
|
|
100
|
+
export type PluginDesignGridsRemoveLinesArgs = z.infer<
|
|
101
|
+
typeof PluginDesignGridsRemoveLinesArgs
|
|
102
|
+
>
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* `design.grids.*` — structural edits on a grid's line structure (the
|
|
106
|
+
* entity-family home for grid-specific operations, like `design.doors`).
|
|
107
|
+
*
|
|
108
|
+
* Lines are addressed positionally as `{ wing, line }` index pairs into the
|
|
109
|
+
* `wings` arrays returned by `design.query.grids.get`. Adding, removing, or
|
|
110
|
+
* re-counting lines re-indexes the wing — re-query after every structural edit.
|
|
111
|
+
*
|
|
112
|
+
* Group-level edits (default styling, angle, storey visibility) live on
|
|
113
|
+
* `design.update.grid`; creation lives on `design.create.grid*`.
|
|
114
|
+
*
|
|
115
|
+
* Accessed via `snaptrude.design.grids`.
|
|
116
|
+
*/
|
|
117
|
+
export abstract class PluginDesignGridsApi {
|
|
118
|
+
constructor() {}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Update one or more **wings** of a grid with sparse per-wing entries —
|
|
122
|
+
* `spacing` (uniform re-space), `count` (grow/truncate + tag renumber),
|
|
123
|
+
* `spanMin`/`spanMax` (family length handles). Every change routes through
|
|
124
|
+
* the exact setters the native panel uses — each changed field commits its
|
|
125
|
+
* own undoable command, identical to editing that field in the panel.
|
|
126
|
+
*
|
|
127
|
+
* A `count` change re-indexes the wing's lines — positional `{ wing, line }`
|
|
128
|
+
* addresses held from before the call are stale afterwards; re-query.
|
|
129
|
+
*
|
|
130
|
+
* @param grid - The grid group
|
|
131
|
+
* @param wings - Sparse {@linkcode PluginGridWingEntry} entries (≥ 1)
|
|
132
|
+
* @returns `true` once applied
|
|
133
|
+
*
|
|
134
|
+
* @examplePrompt Change this grid's spacing to 8 metres
|
|
135
|
+
* @examplePrompt Make this grid 10 by 12 lines
|
|
136
|
+
*
|
|
137
|
+
* # Example
|
|
138
|
+
* ```ts
|
|
139
|
+
* await snaptrude.design.grids.updateWings(grid, [{ wing: 0, spacing: 8, count: 10 }])
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
public abstract updateWings(
|
|
143
|
+
grid: ComponentHandle,
|
|
144
|
+
wings: PluginGridWingEntry[],
|
|
145
|
+
): PluginApiReturn<boolean>
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Update one or more **lines** of a grid with sparse per-line entries —
|
|
149
|
+
* `tag`, `distanceToPrevious`/`distanceToNext` (typed distance to the
|
|
150
|
+
* neighbour on that side; mutually exclusive), `props` (per-line style
|
|
151
|
+
* overrides), and `visible: false` (hide). Every change routes through the
|
|
152
|
+
* exact setters the native panel uses — each changed field commits its own
|
|
153
|
+
* undoable command, identical to editing that field in the panel.
|
|
154
|
+
*
|
|
155
|
+
* Visibility mirrors the product exactly: `visible` accepts only `false` —
|
|
156
|
+
* per-line show does not exist. Hiding lines that would leave NO visible
|
|
157
|
+
* line hides the whole GROUP instead (the native last-line rule; those line
|
|
158
|
+
* flags stay untouched). To bring hidden lines back, show the group
|
|
159
|
+
* (`design.visibility.show([grid])`) — it restores ALL of its lines, like
|
|
160
|
+
* the native Show All.
|
|
161
|
+
*
|
|
162
|
+
* @param grid - The grid group
|
|
163
|
+
* @param lines - Sparse {@linkcode PluginGridLineEntry} entries (≥ 1)
|
|
164
|
+
* @returns `true` once applied
|
|
165
|
+
*
|
|
166
|
+
* @examplePrompt Rename grid line 2 to "B"
|
|
167
|
+
* @examplePrompt Move this grid line 4 metres from its neighbour
|
|
168
|
+
* @examplePrompt Hide grid line 3 on this grid
|
|
169
|
+
*
|
|
170
|
+
* # Example
|
|
171
|
+
* ```ts
|
|
172
|
+
* await snaptrude.design.grids.updateLines(grid, [
|
|
173
|
+
* { wing: 0, line: 1, tag: "B", distanceToPrevious: 4 },
|
|
174
|
+
* ])
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
public abstract updateLines(
|
|
178
|
+
grid: ComponentHandle,
|
|
179
|
+
lines: PluginGridLineEntry[],
|
|
180
|
+
): PluginApiReturn<boolean>
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Insert a parallel grid line into a wing at an explicit position along the
|
|
184
|
+
* wing's spacing axis (Snaptrude units, wing-local — line 0's position can
|
|
185
|
+
* be read from its curve). Sibling lines do not shift; the wing's tag
|
|
186
|
+
* sequence is renumbered. Undoable.
|
|
187
|
+
*
|
|
188
|
+
* @param grid - The grid group
|
|
189
|
+
* @param wing - Wing index
|
|
190
|
+
* @param position - Position along the wing's spacing axis (Snaptrude units)
|
|
191
|
+
* @returns `true` once inserted
|
|
192
|
+
* @throws `VALIDATION` on a bad wing index or non-finite position
|
|
193
|
+
*
|
|
194
|
+
* @examplePrompt Add a grid line between lines 2 and 3
|
|
195
|
+
* @examplePrompt Insert an extra grid line 4 metres from line A
|
|
196
|
+
*
|
|
197
|
+
* # Example
|
|
198
|
+
* ```ts
|
|
199
|
+
* await snaptrude.design.grids.addLine(grid, 0, 12.5)
|
|
200
|
+
* ```
|
|
201
|
+
*/
|
|
202
|
+
public abstract addLine(
|
|
203
|
+
grid: ComponentHandle,
|
|
204
|
+
wing: number,
|
|
205
|
+
position: number,
|
|
206
|
+
): PluginApiReturn<boolean>
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Remove grid lines by positional address, as ONE undoable step. With
|
|
210
|
+
* `tagPolicy: "rewrite"` (default) each affected wing renumbers its tag
|
|
211
|
+
* sequence; `"preserve"` keeps surviving tags unchanged. A wing emptied of
|
|
212
|
+
* lines is dropped from the group.
|
|
213
|
+
*
|
|
214
|
+
* Removing EVERY line of the group is rejected — delete the group instead
|
|
215
|
+
* (`design.delete.entities`).
|
|
216
|
+
*
|
|
217
|
+
* @param grid - The grid group
|
|
218
|
+
* @param lines - Positional addresses to remove (see `design.query.grids.get`)
|
|
219
|
+
* @param tagPolicy - `"rewrite"` (default) or `"preserve"`
|
|
220
|
+
* @returns `true` once removed
|
|
221
|
+
* @throws `VALIDATION` on out-of-range addresses; `OPERATION_FAILED` when the
|
|
222
|
+
* removal would delete the group's last line
|
|
223
|
+
*
|
|
224
|
+
* @examplePrompt Delete grid line B
|
|
225
|
+
* @examplePrompt Remove the last two lines of this grid without renumbering
|
|
226
|
+
*
|
|
227
|
+
* # Example
|
|
228
|
+
* ```ts
|
|
229
|
+
* await snaptrude.design.grids.removeLines(grid, [{ wing: 0, line: 2 }], "preserve")
|
|
230
|
+
* ```
|
|
231
|
+
*/
|
|
232
|
+
public abstract removeLines(
|
|
233
|
+
grid: ComponentHandle,
|
|
234
|
+
lines: PluginGridLineAddress[],
|
|
235
|
+
tagPolicy?: PluginGridLineTagPolicy,
|
|
236
|
+
): PluginApiReturn<boolean>
|
|
237
|
+
}
|