@ferscloud/fers-calculation-web 0.2.38 → 0.2.41

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.
@@ -0,0 +1,2500 @@
1
+ /**
2
+ * This file was auto-generated by openapi-typescript.
3
+ * Do not make direct changes to the file.
4
+ */
5
+
6
+ export type paths = Record<string, never>;
7
+ export type webhooks = Record<string, never>;
8
+ export interface components {
9
+ schemas: {
10
+ /**
11
+ * @description How a member force is reduced to a single value along the member.
12
+ * Internally tagged (`{"type": …}`) so every variant is an object — a mixed
13
+ * bare-string/object `oneOf` breaks the cloud TS generator.
14
+ */
15
+ Aggregation: {
16
+ /** @enum {string} */
17
+ type: "MaxAbs";
18
+ } | {
19
+ /** @enum {string} */
20
+ type: "Max";
21
+ } | {
22
+ /** @enum {string} */
23
+ type: "Min";
24
+ } | {
25
+ /** Format: double */
26
+ fraction: number;
27
+ /** @enum {string} */
28
+ type: "AtFraction";
29
+ } | {
30
+ /** @enum {string} */
31
+ type: "Start";
32
+ } | {
33
+ /** @enum {string} */
34
+ type: "End";
35
+ };
36
+ /** @description Everything that defines a run of the solver against a [`super::model::Model`]. */
37
+ Analysis: {
38
+ buckling?: null | components["schemas"]["BucklingAnalysisSettings"];
39
+ /** @default [] */
40
+ imperfection_cases: components["schemas"]["ImperfectionCase"][];
41
+ /** @default [] */
42
+ load_cases: components["schemas"]["LoadCase"][];
43
+ /** @default [] */
44
+ load_combinations: components["schemas"]["LoadCombination"][];
45
+ modal?: null | components["schemas"]["ModalAnalysisSettings"];
46
+ /** @description Solver options (first/second order, tolerances, self-weight, gravity, …). */
47
+ options: components["schemas"]["AnalysisOptions"];
48
+ seismic?: null | components["schemas"]["SeismicAnalysisSettings"];
49
+ /**
50
+ * @description Post-processing unity checks evaluated against the results.
51
+ * @default []
52
+ */
53
+ unity_checks: components["schemas"]["UnityCheckDefinition"][];
54
+ };
55
+ /** @description Solver options for an analysis run: analysis order (first/second), tolerances, rigid-member strategy, self-weight and gravity. */
56
+ AnalysisOptions: {
57
+ /** Format: double */
58
+ axial_slack?: number;
59
+ dimensionality: components["schemas"]["Dimensionality"];
60
+ /**
61
+ * @description When true, the engine generates self-weight (dead load) for every member
62
+ * from its material density and cross-sectional area, collected into a
63
+ * self-weight load case (see `self_weight_load_case_id`). Cable members
64
+ * carry their weight intrinsically in the catenary formulation and are
65
+ * therefore excluded from the generated self-weight load.
66
+ * @default false
67
+ */
68
+ enable_self_weight: boolean;
69
+ /**
70
+ * @description Global gravity direction as a vector (normalized to a unit vector at use).
71
+ * Default `(0, -1, 0)` — gravity acting in the negative Y direction.
72
+ * @default [
73
+ * 0,
74
+ * -1,
75
+ * 0
76
+ * ]
77
+ */
78
+ gravity_direction: components["schemas"]["Vector3"];
79
+ /**
80
+ * Format: double
81
+ * @description Signed gravitational acceleration magnitude in **m/s² (SI)**, the same in
82
+ * every unit system (it is NOT rescaled with the model's length unit).
83
+ * Default `-9.81`. Self-weight per unit length is
84
+ * `w = density · area · |gravity_factor|` applied along `gravity_direction`,
85
+ * and a member `weight` override maps to modal mass as `weight / |gravity_factor|`.
86
+ * @default -9.81
87
+ */
88
+ gravity_factor: number;
89
+ /**
90
+ * @description When true, each member result carries a sampled deflected-shape polyline
91
+ * (`member_displacements`): the member's global displacement at evenly-spaced
92
+ * stations, from cubic-Hermite interpolation of the end-node translations +
93
+ * rotations. Off by default to keep the result payload lean.
94
+ * @default false
95
+ */
96
+ include_member_deflected_shape: boolean;
97
+ /**
98
+ * @description When true, the solver embeds the single consolidated unity-check HTML
99
+ * report in `results.report_html`. Default false (keeps results JSON lean;
100
+ * the CLI `--report` flag writes the report to a file instead).
101
+ * @default false
102
+ */
103
+ include_report_html: boolean;
104
+ /**
105
+ * @description When false, suppresses shear-center eccentricity coupling (T^T·K·T
106
+ * transformation) by clearing y_s/z_s for all sections. Some commercial
107
+ * solvers do not apply this coupling; disabling it improves agreement.
108
+ * @default true
109
+ */
110
+ include_shear_center_coupling: boolean;
111
+ /**
112
+ * @description When false, forces shear deformation factor φ=0 (Euler-Bernoulli) for all elements.
113
+ * @default true
114
+ */
115
+ include_shear_deformation: boolean;
116
+ /**
117
+ * @description When false, ignores warping constant Iw and uses pure GJ/L torsion for all elements.
118
+ * @default true
119
+ */
120
+ include_warping: boolean;
121
+ /** Format: int32 */
122
+ max_iterations?: number | null;
123
+ /**
124
+ * @description Controls the nonlinear solver formulation (P_DELTA or COROTATIONAL).
125
+ * Only affects second-order (nonlinear) analysis.
126
+ */
127
+ nonlinear_method?: components["schemas"]["NonlinearMethod"];
128
+ order: components["schemas"]["AnalysisOrder"];
129
+ /**
130
+ * @description Controls the geometric stiffness matrix formulation for P-Delta analysis.
131
+ * `Consistent` (default) uses full Przemieniecki K_g; `Simplified` uses
132
+ * P/L-only diagonal terms matching commercial solvers.
133
+ */
134
+ pdelta_formulation?: components["schemas"]["PdeltaFormulation"];
135
+ /**
136
+ * @description High-level P-Delta strategy. `Full` (default) amplifies all directions.
137
+ * `InPlaneOnly` auto-detects the out-of-plane axis from the model's
138
+ * bounding box and suppresses it, matching commercial solver behavior.
139
+ * Overrides `pdelta_suppress_axes` when set to `InPlaneOnly`.
140
+ */
141
+ pdelta_mode?: components["schemas"]["PdeltaMode"];
142
+ /**
143
+ * @description Global translational axes to exclude from P-Delta amplification.
144
+ *
145
+ * When a structure is near buckling in an out-of-plane direction,
146
+ * the consistent P-Delta amplification can produce forces that differ
147
+ * significantly from commercial solvers which
148
+ * typically only amplify in-plane sway.
149
+ *
150
+ * Set to `["Z"]` for in-plane racks/portal frames where Z is out-of-plane,
151
+ * or `["X","Z"]` to limit P-Delta to Y-sway only. Empty (default) means
152
+ * all translational directions are amplified.
153
+ *
154
+ * Maps to global DOFs: "X"→0,7 "Y"→1,8 "Z"→2,9 per element.
155
+ */
156
+ pdelta_suppress_axes?: string[];
157
+ /**
158
+ * @description When true, fill each unity check's per-entity `rendered_report` from its
159
+ * `report_template` (rendered against the entity's computed trace). Default
160
+ * false for speed; orthogonal to `include_report_html` — narratives appear in
161
+ * the consolidated HTML only when this is also true.
162
+ * @default false
163
+ */
164
+ render_unity_reports: boolean;
165
+ rigid_strategy: components["schemas"]["RigidStrategy"];
166
+ /**
167
+ * Format: int32
168
+ * @description Target load case id that generated self-weight loads are injected into.
169
+ * When set, the loads are added to that (typically empty "G") load case so
170
+ * combinations can factor it (e.g. 1.35·G). When `None` and self-weight is
171
+ * enabled, a new load case is created automatically.
172
+ */
173
+ self_weight_load_case_id?: number | null;
174
+ solve_loadcases: boolean;
175
+ /** Format: double */
176
+ tolerance: number;
177
+ };
178
+ /**
179
+ * @description Python:
180
+ * class AnalysisOrder(Enum):
181
+ * LINEAR = "LINEAR"
182
+ * NONLINEAR = "NONLINEAR"
183
+ * @enum {string}
184
+ */
185
+ AnalysisOrder: "LINEAR" | "NONLINEAR";
186
+ /**
187
+ * @description A global coordinate axis.
188
+ * @enum {string}
189
+ */
190
+ Axis: "X" | "Y" | "Z";
191
+ /**
192
+ * @description Request for a linear (eigenvalue) buckling analysis: solve
193
+ * `K·φ = λ·(−K_g)·φ` where `K_g` is the geometric stiffness from the
194
+ * reference load's first-order stress state. Reports the lowest positive
195
+ * critical load factors `α_cr = λ` and their buckling mode shapes.
196
+ */
197
+ BucklingAnalysisSettings: {
198
+ /**
199
+ * Format: int32
200
+ * @description Maximum subspace-iteration sweeps. Defaults to 100 when omitted.
201
+ */
202
+ max_iterations?: number | null;
203
+ /**
204
+ * Format: int32
205
+ * @description Number of buckling modes (lowest positive critical factors) to extract.
206
+ */
207
+ num_modes: number;
208
+ /**
209
+ * @description Reference load whose first-order stress state drives the geometric
210
+ * stiffness `K_g`.
211
+ */
212
+ reference: components["schemas"]["EigenLoadRef"];
213
+ /**
214
+ * Format: double
215
+ * @description Eigen convergence tolerance (relative change in the tracked eigenvalues
216
+ * between subspace sweeps). Defaults to 1e-6 when omitted.
217
+ */
218
+ tolerance?: number | null;
219
+ };
220
+ /**
221
+ * @description Eurocode buckling curve (EN 1993-1-1 Table 6.1/6.2). Maps to imperfection
222
+ * factor α: a0=0.13, a=0.21, b=0.34, c=0.49, d=0.76.
223
+ * @enum {string}
224
+ */
225
+ BucklingCurve: "A0" | "A" | "B" | "C" | "D";
226
+ /** @description A single linear buckling mode. */
227
+ BucklingMode: {
228
+ /**
229
+ * Format: double
230
+ * @description Critical load factor `α_cr = λ`. The structure buckles when the reference
231
+ * load is scaled by this factor (EN 1993-1-1 §5.2.1).
232
+ */
233
+ critical_load_factor: number;
234
+ /**
235
+ * @description Buckling mode shape: per-node displacement pattern (normalized so the
236
+ * largest translational component is 1).
237
+ */
238
+ displacements: {
239
+ [key: string]: components["schemas"]["NodeDisplacement"];
240
+ };
241
+ /**
242
+ * Format: int32
243
+ * @description 1-based mode number (1 = lowest critical load factor).
244
+ */
245
+ mode: number;
246
+ };
247
+ /**
248
+ * @description A buckling restraint located at a node along a member set (one physical beam).
249
+ *
250
+ * Restraints are named by the local member axis they hold (not strong/weak,
251
+ * which depends on the section orientation). The spacing between consecutive
252
+ * nodes that restrain a given local direction yields the unrestrained length
253
+ * used for the corresponding buckling check; restraining twist gives a
254
+ * lateral-torsional restraint. The actual buckling-length computation is
255
+ * performed by the design-check module; this struct only carries the restraint
256
+ * definition through the model.
257
+ */
258
+ BucklingRestraint: {
259
+ /**
260
+ * Format: int32
261
+ * @description Node (on one of the member set's members) where the restraint acts.
262
+ */
263
+ node_id: number;
264
+ /** @description Restrains displacement along the member's local y axis. */
265
+ restrains_local_y?: boolean;
266
+ /** @description Restrains displacement along the member's local z axis. */
267
+ restrains_local_z?: boolean;
268
+ /**
269
+ * @description Restrains twist (rotation about the local x axis), i.e. a
270
+ * lateral-torsional restraint.
271
+ */
272
+ restrains_torsion?: boolean;
273
+ };
274
+ /**
275
+ * @description Results of a linear (eigenvalue) buckling analysis: the lowest positive
276
+ * critical load factors and their buckling mode shapes.
277
+ */
278
+ BucklingResults: {
279
+ modes: components["schemas"]["BucklingMode"][];
280
+ };
281
+ /**
282
+ * @description One line of the transparent hand-calc: a symbolic formula, the same formula
283
+ * with real numbers substituted, and the resulting value + unit (display units).
284
+ */
285
+ CalcStep: {
286
+ formula: string;
287
+ label: string;
288
+ substituted: string;
289
+ unit: string;
290
+ /** Format: double */
291
+ value: number;
292
+ };
293
+ /**
294
+ * @description The evaluator kind. Open union — new codes (AISC, …) add variants; the
295
+ * result/report/colour layer is identical for every variant.
296
+ */
297
+ CheckSpec: {
298
+ Generic: components["schemas"]["GenericSpec"];
299
+ } | {
300
+ Ec3Steel: components["schemas"]["Ec3SteelSpec"];
301
+ };
302
+ /**
303
+ * @description Physical dimension a [`QuantitySource::DimensionedConstant`] carries, so its
304
+ * trace value is scaled + labelled consistently with the quantities it is
305
+ * compared against. Serialized in the input schema (unlike runtime [`Dimension`]).
306
+ * @enum {string}
307
+ */
308
+ ConstantDimension: "Length" | "Force" | "Moment" | "Stress" | "Area" | "Angle";
309
+ /**
310
+ * @description Transverse deflection component, measured relative to the entity's end-to-end
311
+ * chord (local-frame axes perpendicular to the chord).
312
+ * @enum {string}
313
+ */
314
+ DeflectionComponent: "LocalY" | "LocalZ" | "Magnitude";
315
+ /** @enum {string} */
316
+ DensityUnit: "kg/m3" | "kg/mm3";
317
+ /**
318
+ * @description Python:
319
+ * class Dimensionality(Enum):
320
+ * TWO_DIMENSIONAL = "2D"
321
+ * THREE_DIMENSIONAL = "3D"
322
+ * @enum {string}
323
+ */
324
+ Dimensionality: "2D" | "3D";
325
+ /**
326
+ * @description Directional combination rule across excitation directions.
327
+ * @enum {string}
328
+ */
329
+ DirectionalCombination: "SRSS" | "PERCENT30";
330
+ /**
331
+ * @description Nodal displacement component.
332
+ * @enum {string}
333
+ */
334
+ DispComponent: "Dx" | "Dy" | "Dz" | "Rx" | "Ry" | "Rz" | "Magnitude";
335
+ /** @description A linearly varying distributed load applied along a member over a fractional span (start/end magnitudes). */
336
+ DistributedLoad: {
337
+ direction: components["schemas"]["Vector3"];
338
+ /** Format: double */
339
+ end_frac: number;
340
+ /** Format: double */
341
+ end_magnitude: number;
342
+ /** Format: int32 */
343
+ id: number;
344
+ /** Format: double */
345
+ magnitude: number;
346
+ /** Format: int32 */
347
+ member: number;
348
+ /** Format: double */
349
+ start_frac: number;
350
+ };
351
+ /**
352
+ * @description EN 1993-1-1 (steel) design parameters for a section. Engineer-supplied
353
+ * (we don't auto-classify — flange/web geometry isn't stored). Namespaced under
354
+ * `Section.ec3` so other codes (e.g. AISC) can add their own block without
355
+ * polluting the universal section properties.
356
+ */
357
+ Ec3SectionParams: {
358
+ /**
359
+ * Format: double
360
+ * @description Effective area for class 4 sections (EN 1993-1-5 §4.3), in the model's
361
+ * area unit. Required together with `wel_y_eff` to run EC3 checks on a
362
+ * class 4 section.
363
+ */
364
+ a_eff?: number | null;
365
+ buckling_curve_lt?: null | components["schemas"]["BucklingCurve"];
366
+ buckling_curve_y?: null | components["schemas"]["BucklingCurve"];
367
+ buckling_curve_z?: null | components["schemas"]["BucklingCurve"];
368
+ /**
369
+ * Format: int32
370
+ * @description Cross-section class 1–4 (EN 1993-1-1 §5.5). Class 4 needs effective
371
+ * properties (currently a limitation — see the EC3 evaluator).
372
+ */
373
+ section_class?: number | null;
374
+ /**
375
+ * Format: double
376
+ * @description Effective elastic section modulus about y (major axis) for class 4
377
+ * sections (EN 1993-1-5), in the model's section-modulus unit.
378
+ */
379
+ wel_y_eff?: number | null;
380
+ /**
381
+ * Format: double
382
+ * @description Effective elastic section modulus about z (minor axis) for class 4
383
+ * sections (EN 1993-1-5), in the model's section-modulus unit.
384
+ */
385
+ wel_z_eff?: number | null;
386
+ /**
387
+ * Format: double
388
+ * @description Mono-symmetry parameter `z_j` (EN 1993-1-1 / NCCI SN030) in the model's
389
+ * length unit; 0 for doubly-symmetric sections. Enables the general LTB
390
+ * `M_cr` (used with the spec's C2/C3/z_g).
391
+ */
392
+ z_j?: number | null;
393
+ };
394
+ /** @description Built-in EN 1993-1-1 steel member check (§6.2 cross-section + §6.3 buckling). */
395
+ Ec3SteelSpec: {
396
+ /**
397
+ * Format: double
398
+ * @description LTB moment-distribution factor C1. When omitted it is computed from the
399
+ * member's actual moment diagram (NCCI SN003 quarter-point formula); set it
400
+ * explicitly to override (e.g. 1.0 = conservative uniform moment).
401
+ */
402
+ c1?: number | null;
403
+ /**
404
+ * Format: double
405
+ * @description LTB factors C2 / C3 for the general `M_cr` (load height / mono-symmetry).
406
+ * Default 0.0 → the doubly-symmetric form (no load-height or z_j term).
407
+ * @default 0
408
+ */
409
+ c2: number;
410
+ /**
411
+ * Format: double
412
+ * @default 0
413
+ */
414
+ c3: number;
415
+ /**
416
+ * Format: double
417
+ * @default 1
418
+ */
419
+ gamma_m0: number;
420
+ /**
421
+ * Format: double
422
+ * @default 1
423
+ */
424
+ gamma_m1: number;
425
+ /** @default true */
426
+ include_buckling: boolean;
427
+ /** @default true */
428
+ include_ltb: boolean;
429
+ interaction_method?: components["schemas"]["InteractionMethod"];
430
+ /**
431
+ * Format: double
432
+ * @description Transverse-load application height `z_g` above the shear centre (model
433
+ * length units). Positive = destabilising (load above shear centre).
434
+ * Default 0.0 (load at the shear centre).
435
+ * @default 0
436
+ */
437
+ z_g: number;
438
+ };
439
+ /**
440
+ * @description Which load drives the reference stress state for a linear buckling analysis.
441
+ * Its first-order member axial forces scale linearly with the load, so the
442
+ * returned eigenvalue is the critical load factor `α_cr` directly.
443
+ */
444
+ EigenLoadRef: {
445
+ /**
446
+ * Format: int32
447
+ * @description Reference a load case by id.
448
+ */
449
+ LoadCase: number;
450
+ } | {
451
+ /**
452
+ * Format: int32
453
+ * @description Reference a load combination by id.
454
+ */
455
+ LoadCombination: number;
456
+ };
457
+ /**
458
+ * @description Generic, calculation-agnostic grouping of model entities for UI /
459
+ * visualization. Metadata only — ignored by the solver, surfaced in the
460
+ * OpenAPI schema for consumers (mirrors `WorkPlane`/`WorkAxis`). A group may
461
+ * reference any mix of entity kinds via the typed id lists below; each list
462
+ * defaults to empty.
463
+ */
464
+ EntityGroup: {
465
+ /** Format: int32 */
466
+ id: number;
467
+ member_ids?: number[];
468
+ member_set_ids?: number[];
469
+ name?: string;
470
+ node_ids?: number[];
471
+ /** @description Generated plate finite elements. */
472
+ plate_element_ids?: number[];
473
+ /** @description Modeled plate surfaces. */
474
+ plate_surface_ids?: number[];
475
+ support_ids?: number[];
476
+ work_axis_ids?: number[];
477
+ work_plane_ids?: number[];
478
+ };
479
+ /**
480
+ * @description A node named relative to the entity (member) being checked — its own ends, or,
481
+ * via the member's `reference_member` / `reference_node`, a paired member/node.
482
+ * Lets a check compare against the member it points at, reusably by classification
483
+ * (each member carries its own reference).
484
+ * @enum {string}
485
+ */
486
+ EntityNodeRef: "Start" | "End" | "ReferenceMemberStart" | "ReferenceMemberEnd" | "ReferenceNode";
487
+ /**
488
+ * @description Which entity a result belongs to. A tagged union (`{"type": …, "<kind>_id": …}`)
489
+ * so exactly one target kind is set — consistent with `EntitySelector` and
490
+ * `PlatePressureTarget`.
491
+ */
492
+ EntityRef: {
493
+ /** Format: int32 */
494
+ member_id: number;
495
+ /** @enum {string} */
496
+ type: "Member";
497
+ } | {
498
+ /** Format: int32 */
499
+ memberset_id: number;
500
+ /** @enum {string} */
501
+ type: "MemberSet";
502
+ } | {
503
+ /** Format: int32 */
504
+ plate_element_id: number;
505
+ /** @enum {string} */
506
+ type: "PlateElement";
507
+ } | {
508
+ /** Format: int32 */
509
+ plate_surface_id: number;
510
+ /** @enum {string} */
511
+ type: "PlateSurface";
512
+ };
513
+ /**
514
+ * @description Which entities a check applies to. Internally tagged (`{"type": …}`) so every
515
+ * variant is an object (a mixed bare-string/object `oneOf` breaks the cloud TS
516
+ * generator).
517
+ */
518
+ EntitySelector: {
519
+ /** @enum {string} */
520
+ type: "AllMembers";
521
+ } | {
522
+ ids: number[];
523
+ /** @enum {string} */
524
+ type: "Members";
525
+ } | {
526
+ ids: number[];
527
+ /** @enum {string} */
528
+ type: "MemberSets";
529
+ } | {
530
+ /** @enum {string} */
531
+ type: "MemberClassification";
532
+ value: string;
533
+ } | {
534
+ /** @enum {string} */
535
+ type: "AllPlates";
536
+ } | {
537
+ ids: number[];
538
+ /** @enum {string} */
539
+ type: "PlateSurfaces";
540
+ } | {
541
+ ids: number[];
542
+ /** @enum {string} */
543
+ type: "PlateElements";
544
+ };
545
+ /**
546
+ * @description Which member a property/force quantity resolves against: the entity itself, or
547
+ * the member named by its `reference_member`. Defaults to the entity (so existing
548
+ * checks are unchanged).
549
+ * @enum {string}
550
+ */
551
+ EntityTarget: "SelfEntity" | "ReferenceMember";
552
+ /** @description The result of one check for one entity, enveloped over the applicable combos. */
553
+ EntityUnityResult: {
554
+ /** Format: double */
555
+ capacity?: number | null;
556
+ /** Format: double */
557
+ demand: number;
558
+ entity: components["schemas"]["EntityRef"];
559
+ /** Format: int32 */
560
+ governing_combination_id?: number | null;
561
+ /** Format: double */
562
+ location_x_frac?: number | null;
563
+ message?: string | null;
564
+ /** @description Rendered narrative report (from the check's `report_template`), if any. */
565
+ rendered_report?: string | null;
566
+ status: components["schemas"]["UnityStatus"];
567
+ /**
568
+ * @description Transparent hand-calc trace (symbolic + substituted) in display units.
569
+ * @default []
570
+ */
571
+ trace: components["schemas"]["CalcStep"][];
572
+ /** Format: double */
573
+ utilization: number;
574
+ };
575
+ /**
576
+ * @description Per-result solver diagnostics. `errors` mark results that are present but not
577
+ * trustworthy (e.g. a second-order load that meets or exceeds the elastic
578
+ * critical/buckling load); `warnings` are advisory. Empty in the common case.
579
+ */
580
+ ErrorsAndWarnings: {
581
+ /** @default [] */
582
+ errors: components["schemas"]["SolverMessage"][];
583
+ /** @default [] */
584
+ warnings: components["schemas"]["SolverMessage"][];
585
+ };
586
+ /** @description Root FERS document: settings, the structural model, the analysis to run, and (after solving) results. */
587
+ FERS: {
588
+ /** @description The analysis definition: solver options + load/imperfection cases. */
589
+ analysis: components["schemas"]["Analysis"];
590
+ /** @description The structural model: geometry, topology, materials, workspace. */
591
+ model: components["schemas"]["Model"];
592
+ results?: null | components["schemas"]["ResultsBundle"];
593
+ /**
594
+ * Format: int32
595
+ * @description Schema contract version (see [`SCHEMA_VERSION`]). Defaults to the current
596
+ * version when omitted so older documents still parse.
597
+ * @default 2
598
+ */
599
+ schema_version: number;
600
+ /** @description Units + general info (analysis solver options live on `analysis.options`). */
601
+ settings: components["schemas"]["Settings"];
602
+ };
603
+ /** @enum {string} */
604
+ ForceUnit: "N" | "kN";
605
+ /** @description Project metadata (name, author, version) shown in reports. */
606
+ GeneralInfo: {
607
+ author: string;
608
+ project_name: string;
609
+ version: string;
610
+ };
611
+ /**
612
+ * @description A user-authored, templated-formula check. `utilization = demand / capacity`,
613
+ * both evaluated in SI; the report shows each step filled in with real numbers.
614
+ */
615
+ GenericSpec: {
616
+ /** @description Capacity (resistance) expression, e.g. `"fy"`. */
617
+ capacity: string;
618
+ /**
619
+ * @description Demand (action effect) expression, e.g.
620
+ * `"bending_moment * fibre_distance / second_moment_of_area"`.
621
+ */
622
+ demand: string;
623
+ /**
624
+ * @description Named variables referenced by `demand`/`capacity` (and, via the computed
625
+ * trace, by the check's `report_template`).
626
+ * @default []
627
+ */
628
+ variables: components["schemas"]["VarBinding"][];
629
+ };
630
+ /**
631
+ * @description A geometric quantity.
632
+ * @enum {string}
633
+ */
634
+ GeometryProperty: "Length";
635
+ /**
636
+ * @description EN 1998-1 ground type (Table 3.1) selecting the spectrum shape parameters.
637
+ * @enum {string}
638
+ */
639
+ GroundType: "A" | "B" | "C" | "D" | "E";
640
+ /** @description Geometric imperfections (sway/translation) applied for a set of load combinations. */
641
+ ImperfectionCase: {
642
+ /** Format: int32 */
643
+ imperfection_case_id: number;
644
+ load_combinations: number[];
645
+ sway_imperfections: components["schemas"]["SwayImperfection"][];
646
+ translation_imperfections: components["schemas"]["TranslationImperfection"][];
647
+ };
648
+ /**
649
+ * @description k_ij interaction-factor method for EN 1993-1-1 §6.3.3.
650
+ * @enum {string}
651
+ */
652
+ InteractionMethod: "AnnexA" | "AnnexB";
653
+ /** @description Lateral-force (equivalent static) method results (§4.3.3.2). */
654
+ LateralForceResults: {
655
+ combined: components["schemas"]["Results"];
656
+ per_direction: components["schemas"]["SeismicDirectionResult"][];
657
+ };
658
+ /** @enum {string} */
659
+ LengthUnit: "mm" | "cm" | "m";
660
+ /** @enum {string} */
661
+ LimitState: "SLS" | "ULS" | "FLS" | "ALS";
662
+ /**
663
+ * @description The coordinate frame a member point load/moment direction is expressed in.
664
+ * @enum {string}
665
+ */
666
+ LoadAxes: "global" | "local";
667
+ /** @description A named collection of loads (nodal, distributed, surface, member point loads/moments, plate pressures, imperfections). */
668
+ LoadCase: {
669
+ /** @default [] */
670
+ distributed_loads: components["schemas"]["DistributedLoad"][];
671
+ /** Format: int32 */
672
+ id: number;
673
+ /** @default [] */
674
+ member_point_loads: components["schemas"]["MemberPointLoad"][];
675
+ /** @default [] */
676
+ member_point_moments: components["schemas"]["MemberPointMoment"][];
677
+ name: string;
678
+ /** @default [] */
679
+ nodal_loads: components["schemas"]["NodalLoad"][];
680
+ /** @default [] */
681
+ nodal_moments: components["schemas"]["NodalMoment"][];
682
+ /** @default [] */
683
+ plate_pressures: components["schemas"]["PlatePressure"][];
684
+ /** @default [] */
685
+ surface_loads: components["schemas"]["SurfaceLoad"][];
686
+ };
687
+ /** @description One `(load case, factor)` term of a load combination. */
688
+ LoadCaseFactor: {
689
+ /** Format: double */
690
+ factor: number;
691
+ /** Format: int32 */
692
+ load_case_id: number;
693
+ };
694
+ /** @description A factored combination of load cases for a given limit state (SLS/ULS/FLS/ALS). */
695
+ LoadCombination: {
696
+ check: string;
697
+ /** Format: int32 */
698
+ id: number;
699
+ limit_state?: null | components["schemas"]["LimitState"];
700
+ load_case_factors: components["schemas"]["LoadCaseFactor"][];
701
+ name: string;
702
+ situation?: string | null;
703
+ };
704
+ /**
705
+ * @description Distinguishes a concentrated force from a concentrated moment at a node.
706
+ * @enum {string}
707
+ */
708
+ LoadType: "force" | "moment";
709
+ /**
710
+ * @description Mass-matrix formulation for modal (natural-frequency) analysis.
711
+ *
712
+ * - **Consistent** (default): full Przemieniecki element mass matrix that
713
+ * couples translations and rotations. More accurate, matches the consistent
714
+ * stiffness matrix, and is positive-definite on translational + rotational
715
+ * DOFs.
716
+ * - **Lumped**: diagonal mass matrix (HRZ-style half-mass at each node for the
717
+ * translational DOFs only). Simpler and cheaper; rotational/warping DOFs
718
+ * carry no inertia, so the mass matrix is only positive-semidefinite. The
719
+ * subspace-iteration eigensolver handles the massless DOFs.
720
+ *
721
+ * Python:
722
+ * class MassFormulation(Enum):
723
+ * CONSISTENT = "CONSISTENT"
724
+ * LUMPED = "LUMPED"
725
+ * @enum {string}
726
+ */
727
+ MassFormulation: "CONSISTENT" | "LUMPED";
728
+ /** @description An isotropic material (E, G, density, yield strength) with optional orthotropic plate properties. */
729
+ Material: {
730
+ /** Format: double */
731
+ density: number;
732
+ /** Format: double */
733
+ e_mod: number;
734
+ /** Format: double */
735
+ g_mod: number;
736
+ /** Format: int32 */
737
+ id: number;
738
+ name: string;
739
+ orthotropic_plate?: null | components["schemas"]["OrthotropicPlateMaterial"];
740
+ /** Format: double */
741
+ yield_stress: number;
742
+ };
743
+ /**
744
+ * @description A material property.
745
+ * @enum {string}
746
+ */
747
+ MaterialProperty: "E" | "G" | "Fy" | "Density";
748
+ /** @description A finite-element member between two nodes, with a section, member type and optional end hinges/offsets. */
749
+ Member: {
750
+ /**
751
+ * Format: double
752
+ * @description Optional user-supplied buckling reduction factor χ (EN 1993-1-1 §6.3).
753
+ * Currently informational: the EC3 unity-check evaluator computes its own χ
754
+ * from the section's buckling curve and does not yet read this override.
755
+ */
756
+ chi?: number | null;
757
+ /**
758
+ * @description Free-text grouping key used to target this member in unity checks
759
+ * (`EntitySelector::MemberClassification`). `None` = unclassified.
760
+ */
761
+ classification?: string | null;
762
+ /** Format: int32 */
763
+ end_hinge?: number | null;
764
+ /** Format: int32 */
765
+ end_node_id: number;
766
+ end_offset?: null | components["schemas"]["MemberEndOffset"];
767
+ /** Format: int32 */
768
+ id: number;
769
+ member_type: components["schemas"]["MemberType"];
770
+ /**
771
+ * @description When true, the cross-section is mirrored: shear-center offsets y_s and
772
+ * z_s are negated, and the shape_path geometry is flipped.
773
+ */
774
+ mirror?: boolean;
775
+ /**
776
+ * Format: double
777
+ * @description Initial cable tension (force units) for `Cable` members. Used to derive
778
+ * the unstretched length when `unstretched_length` is not given directly:
779
+ * `L₀ = L_chord / (1 + pretension/EA)`. Ignored for non-cable members.
780
+ */
781
+ pretension?: number | null;
782
+ /**
783
+ * Format: int32
784
+ * @description Reference member used by the modeler/UI to define this member's orientation
785
+ * or grouping. Not used by the solver; preserved for consumers/unity checks.
786
+ */
787
+ reference_member?: number | null;
788
+ /**
789
+ * Format: int32
790
+ * @description Reference node used by the modeler/UI (e.g. orientation reference). Not used
791
+ * by the solver; preserved for consumers/unity checks.
792
+ */
793
+ reference_node?: number | null;
794
+ /** Format: double */
795
+ rotation_angle: number;
796
+ /** Format: int32 */
797
+ section?: number | null;
798
+ /** Format: int32 */
799
+ start_hinge?: number | null;
800
+ /** Format: int32 */
801
+ start_node_id: number;
802
+ start_offset?: null | components["schemas"]["MemberEndOffset"];
803
+ /**
804
+ * Format: double
805
+ * @description Explicit unstretched (natural) length L₀ (length units) for `Cable`
806
+ * members. Takes precedence over `pretension`. When neither is set, the
807
+ * cable's unstretched length defaults to the straight chord length.
808
+ */
809
+ unstretched_length?: number | null;
810
+ /**
811
+ * Format: double
812
+ * @description Optional self-weight override as a gravity load **per unit length**, in the
813
+ * model's force/length units (already including g). When non-zero it replaces
814
+ * the computed `density · area · g` self-weight for this member (see
815
+ * `append_self_weight_loads`); `0.0` means "use the computed value".
816
+ */
817
+ weight: number;
818
+ };
819
+ /**
820
+ * @description One sampled point on a member's deflected shape: the global displacement
821
+ * `[dx, dy, dz]` at fractional position `x_frac ∈ [0, 1]` along the member
822
+ * (0 = start node, 1 = end node).
823
+ */
824
+ MemberDisplacementSample: {
825
+ /** @description Global displacement `[dx, dy, dz]` at this station, in model length units. */
826
+ displacement: components["schemas"]["Vector3"];
827
+ /**
828
+ * Format: double
829
+ * @description Fractional position along the member, 0 (start) … 1 (end).
830
+ */
831
+ x_frac: number;
832
+ };
833
+ /**
834
+ * @description A rigid offset between a member end and its node, in the **global** frame
835
+ * (`X`, `Y`, `Z`).
836
+ */
837
+ MemberEndOffset: {
838
+ /** Format: double */
839
+ X?: number;
840
+ /** Format: double */
841
+ Y?: number;
842
+ /** Format: double */
843
+ Z?: number;
844
+ };
845
+ /**
846
+ * @description Local member force component (member local axes). Used by member unity checks
847
+ * (`QuantitySource::MemberForce`) and member-hinge stiffness curves. Distinct
848
+ * from [`crate::models::stiffness_curve::SupportForceComponent`], whose global
849
+ * `Fx/Fy/Fz` reaction names apply to support stiffness curves.
850
+ * @enum {string}
851
+ */
852
+ MemberForceComponent: "N" | "Vy" | "Vz" | "Mx" | "My" | "Mz" | "Bimoment";
853
+ /** @description A member end release / spring: translational and rotational stiffnesses with optional nonlinear curves. */
854
+ MemberHinge: {
855
+ /**
856
+ * @description Free-text label for human readability only (e.g. `"Column base"`,
857
+ * `"SPRING_YZ"`). The solver ignores this field — actual hinge behavior is
858
+ * driven entirely by the release/stiffness fields below. Not a constrained
859
+ * value set, so intentionally a `String` rather than an enum.
860
+ */
861
+ hinge_type: string;
862
+ /** Format: int32 */
863
+ id: number;
864
+ /** Format: double */
865
+ max_bimoment_warp?: number | null;
866
+ /** Format: double */
867
+ max_moment_mx?: number | null;
868
+ /** Format: double */
869
+ max_moment_my?: number | null;
870
+ /** Format: double */
871
+ max_moment_mz?: number | null;
872
+ /** Format: double */
873
+ max_tension_vx?: number | null;
874
+ /** Format: double */
875
+ max_tension_vy?: number | null;
876
+ /** Format: double */
877
+ max_tension_vz?: number | null;
878
+ /** Format: double */
879
+ rotational_release_mx?: number | null;
880
+ /** Format: double */
881
+ rotational_release_my?: number | null;
882
+ /** Format: double */
883
+ rotational_release_mz?: number | null;
884
+ /** Format: double */
885
+ rotational_release_warp?: number | null;
886
+ stiffness_curve_mx?: null | components["schemas"]["MemberStiffnessCurve"];
887
+ stiffness_curve_my?: null | components["schemas"]["MemberStiffnessCurve"];
888
+ stiffness_curve_mz?: null | components["schemas"]["MemberStiffnessCurve"];
889
+ stiffness_curve_vx?: null | components["schemas"]["MemberStiffnessCurve"];
890
+ stiffness_curve_vy?: null | components["schemas"]["MemberStiffnessCurve"];
891
+ stiffness_curve_vz?: null | components["schemas"]["MemberStiffnessCurve"];
892
+ /** Format: double */
893
+ translational_release_vx?: number | null;
894
+ /** Format: double */
895
+ translational_release_vy?: number | null;
896
+ /** Format: double */
897
+ translational_release_vz?: number | null;
898
+ };
899
+ /** @description A concentrated force applied at a fractional position along a member. */
900
+ MemberPointLoad: {
901
+ /**
902
+ * @description Coordinate frame the `direction` is expressed in.
903
+ * @default global
904
+ */
905
+ axes: components["schemas"]["LoadAxes"];
906
+ /** @description Load direction unit vector (global or local axes). */
907
+ direction: components["schemas"]["Vector3"];
908
+ /** Format: int32 */
909
+ id: number;
910
+ /** Format: double */
911
+ magnitude: number;
912
+ /** Format: int32 */
913
+ member: number;
914
+ /**
915
+ * Format: double
916
+ * @description Fractional position along the member (0.0 = start, 1.0 = end).
917
+ */
918
+ position: number;
919
+ };
920
+ /** @description A concentrated moment applied at a fractional position along a member. */
921
+ MemberPointMoment: {
922
+ /**
923
+ * @description Coordinate frame the `direction` is expressed in.
924
+ * @default global
925
+ */
926
+ axes: components["schemas"]["LoadAxes"];
927
+ /** @description Load direction unit vector (global or local axes). */
928
+ direction: components["schemas"]["Vector3"];
929
+ /** Format: int32 */
930
+ id: number;
931
+ /** Format: double */
932
+ magnitude: number;
933
+ /** Format: int32 */
934
+ member: number;
935
+ /**
936
+ * Format: double
937
+ * @description Fractional position along the member (0.0 = start, 1.0 = end).
938
+ */
939
+ position: number;
940
+ };
941
+ /**
942
+ * @description Per-member result: local/global end forces, envelope maxima/minima, and section forces.
943
+ *
944
+ * ## Sign convention (see also `compute_section_forces` in `functions/results.rs`)
945
+ *
946
+ * - **Frames.** `start_node_forces` / `end_node_forces` are in the **global** frame.
947
+ * `local_*` fields and `section_forces` are in the member's **local centroidal**
948
+ * frame. For geometrically-nonlinear (corotational) results the local frame is the
949
+ * **corotated (deformed-element) frame**, so the bending moment stays in one
950
+ * component along a co-linear member chain and section forces interpolate correctly.
951
+ * - **Start vs end node.** The two member ends report forces in the static-equilibrium
952
+ * ("nodal reaction") convention, so the **end node is the Newton's-3rd-law opposite**
953
+ * of the start node and the interior `section_forces`. Plotting
954
+ * `[start, …section_forces…, end]` raw therefore draws a `value → −value` sawtooth;
955
+ * use [`MemberResult::internal_force_series`] (which negates the end node) for a
956
+ * continuous diagram, or negate `local_end_forces` yourself.
957
+ * - **Components.** Axial `fx` is **tension-positive**; `fy`/`fz` are shears, `mx` is
958
+ * torsion, `my`/`mz` are bending moments, `bw` is the warping bimoment.
959
+ */
960
+ MemberResult: {
961
+ /**
962
+ * @description Member-end force at the end node, in the **global** frame (Newton's-3rd-law
963
+ * opposite of the start-node internal force).
964
+ */
965
+ end_node_forces: components["schemas"]["NodeForces"];
966
+ /**
967
+ * @description Continuous, ready-to-plot internal force diagram from `x_frac = 0` (start) to
968
+ * `x_frac = 1` (end), in the local frame: `local_start_forces`, then
969
+ * `section_forces`, then the **negated** `local_end_forces` (converted from the
970
+ * Newton's-3rd-law node reaction to the internal-force convention) so the series
971
+ * is continuous with no sawtooth across shared nodes.
972
+ */
973
+ internal_force_series?: components["schemas"]["SectionForce"][];
974
+ local_displacement_end_node: components["schemas"]["NodeDisplacement"];
975
+ local_displacement_start_node: components["schemas"]["NodeDisplacement"];
976
+ /**
977
+ * @description Internal force at the end node, in the member **local centroidal** frame.
978
+ * This is the nodal-reaction convention, i.e. the Newton's-3rd-law opposite of
979
+ * the internal force at the end — negate it to get the continuous internal value.
980
+ */
981
+ local_end_forces: components["schemas"]["NodeForces"];
982
+ /** @description Per-component maxima over the member, in the local frame. */
983
+ local_maximums: components["schemas"]["NodeForces"];
984
+ /** @description Per-component minima over the member, in the local frame. */
985
+ local_minimums: components["schemas"]["NodeForces"];
986
+ /**
987
+ * @description Internal force at the start node, in the member **local centroidal** frame
988
+ * (corotated frame for nonlinear results). Equals `internal_force_series[0]`.
989
+ */
990
+ local_start_forces: components["schemas"]["NodeForces"];
991
+ /** @description Per-component maxima over the member (global frame). */
992
+ maximums: components["schemas"]["NodeForces"];
993
+ /**
994
+ * @description Optional sampled deflected shape: the member's global displacement at
995
+ * evenly-spaced stations from `x_frac = 0` to `1`, reconstructed by
996
+ * cubic-Hermite interpolation of the end-node translations + rotations.
997
+ * Empty unless `AnalysisOptions::include_member_deflected_shape` is enabled.
998
+ * The interpolation is the end-DOF homogeneous cubic — exact for members with
999
+ * no span load; under a member UDL the true shape is quartic, so mid-span sag
1000
+ * is slightly under-rendered (matching client-side Hermite reconstructions).
1001
+ */
1002
+ member_displacements?: components["schemas"]["MemberDisplacementSample"][];
1003
+ /** @description Per-component minima over the member (global frame). */
1004
+ minimums: components["schemas"]["NodeForces"];
1005
+ /**
1006
+ * @description Continuous internal forces at evenly-spaced **interior** fractions
1007
+ * (`0 < x_frac < 1`), in the local frame. These already follow the internal-force
1008
+ * convention (no end-node flip). For a ready-to-plot 0→1 diagram including the
1009
+ * endpoints use [`MemberResult::internal_force_series`].
1010
+ */
1011
+ section_forces: components["schemas"]["SectionForce"][];
1012
+ /** @description Member-end force at the start node, in the **global** frame. */
1013
+ start_node_forces: components["schemas"]["NodeForces"];
1014
+ };
1015
+ /**
1016
+ * @description A member set represents one physical beam: the ordered chain of collinear
1017
+ * finite-element members that together form a single continuous structural
1018
+ * member. Members are referenced by id; the member objects themselves live in
1019
+ * the top-level `FERS.members` list.
1020
+ */
1021
+ MemberSet: {
1022
+ /**
1023
+ * Format: double
1024
+ * @description Buckling-length overrides for code checks (EN 1993-1-1 §6.3). When absent,
1025
+ * the unity-check evaluator derives L_cr from `buckling_restraints` spacing.
1026
+ * Explicit lengths (m) take precedence over the factors.
1027
+ */
1028
+ buckling_length_y?: number | null;
1029
+ /** Format: double */
1030
+ buckling_length_z?: number | null;
1031
+ /**
1032
+ * @description Node-based buckling restraints along the beam (replaces scalar l_y/l_z).
1033
+ * @default []
1034
+ */
1035
+ buckling_restraints: components["schemas"]["BucklingRestraint"][];
1036
+ /**
1037
+ * @description Free-text label for the modeler/UI (e.g. "Upright", "Beam"); not used by
1038
+ * the solver.
1039
+ */
1040
+ classification?: string | null;
1041
+ /**
1042
+ * Format: double
1043
+ * @description Effective-length factor K_y (L_cr,y = K_y · L) when no explicit length given.
1044
+ */
1045
+ effective_length_factor_y?: number | null;
1046
+ /** Format: double */
1047
+ effective_length_factor_z?: number | null;
1048
+ /** Format: int32 */
1049
+ id: number;
1050
+ /**
1051
+ * Format: double
1052
+ * @description Unrestrained length for lateral-torsional buckling (m).
1053
+ */
1054
+ ltb_length?: number | null;
1055
+ /** @description Ids of the members (in `FERS.members`) that make up this beam. */
1056
+ member_ids: number[];
1057
+ };
1058
+ /**
1059
+ * @description A **member-hinge** spring stiffness that varies with a member-local force.
1060
+ *
1061
+ * `points` is a sorted list of `[force_value, stiffness]` pairs and `depends_on`
1062
+ * is the member-local force component driving the interpolation. `Bimoment` is
1063
+ * not a valid curve driver (no slot in the member-end force array).
1064
+ */
1065
+ MemberStiffnessCurve: {
1066
+ /** @description Which member-local force component the stiffness depends on. */
1067
+ depends_on: components["schemas"]["MemberStiffnessCurveDriver"];
1068
+ /** @description Sorted `[force_value, stiffness]` pairs (≥ 2 points, positive stiffness). */
1069
+ points: [
1070
+ number,
1071
+ number
1072
+ ][];
1073
+ /**
1074
+ * @description When `true`, the curve is driven by the SIGNED force, so tension and
1075
+ * compression can have different stiffness (points may span negative
1076
+ * force). When `false` (default), the curve is driven by `|force|`
1077
+ * (symmetric in tension/compression — the legacy behaviour).
1078
+ */
1079
+ signed?: boolean;
1080
+ };
1081
+ /**
1082
+ * @description Which member-local force component a **member-hinge** stiffness curve depends on.
1083
+ *
1084
+ * A subset of [`crate::models::unitychecks::quantities::MemberForceComponent`]:
1085
+ * the six member-end force/moment components, excluding `Bimoment` (which has no
1086
+ * slot in the member-end force array and cannot drive a curve). Keeping a
1087
+ * dedicated driver enum makes the schema express exactly what is valid.
1088
+ * @enum {string}
1089
+ */
1090
+ MemberStiffnessCurveDriver: "N" | "Vy" | "Vz" | "Mx" | "My" | "Mz";
1091
+ /** @enum {string} */
1092
+ MemberType: "Normal" | "Truss" | "Tension" | "Compression" | "Rigid" | "Cable";
1093
+ /**
1094
+ * @description Request for a modal (natural-frequency) analysis: solve `K·φ = ω²·M·φ` and
1095
+ * report the lowest `num_modes` natural frequencies and mode shapes. Mass comes
1096
+ * from the structural self-mass (`density · area`), honoring the per-member
1097
+ * `weight` override (a gravity force per unit length, so mass/length =
1098
+ * `weight / |gravity_factor|`).
1099
+ */
1100
+ ModalAnalysisSettings: {
1101
+ /** @description Mass-matrix formulation (Consistent default, Lumped optional). */
1102
+ mass_formulation?: components["schemas"]["MassFormulation"];
1103
+ /**
1104
+ * Format: int32
1105
+ * @description Maximum subspace-iteration sweeps. Defaults to 100 when omitted.
1106
+ */
1107
+ max_iterations?: number | null;
1108
+ /**
1109
+ * Format: int32
1110
+ * @description Number of natural modes (lowest frequencies) to extract.
1111
+ */
1112
+ num_modes: number;
1113
+ /**
1114
+ * Format: double
1115
+ * @description Eigen convergence tolerance (relative change in the tracked eigenvalues
1116
+ * between subspace sweeps). Defaults to 1e-6 when omitted.
1117
+ */
1118
+ tolerance?: number | null;
1119
+ };
1120
+ /**
1121
+ * @description Modal combination rule for MRSA.
1122
+ * @enum {string}
1123
+ */
1124
+ ModalCombination: "CQC" | "SRSS";
1125
+ /**
1126
+ * @description Results of a modal (natural-frequency) analysis: the lowest natural modes of
1127
+ * the structure, sorted by ascending frequency.
1128
+ *
1129
+ * All quantities are SI / time-based and therefore independent of the model's
1130
+ * length and force units: frequencies in hertz, periods in seconds, masses in
1131
+ * kilograms. Mode shapes are normalized so the largest translational component
1132
+ * equals 1 (a unit-free shape); the generalized mass and effective modal mass
1133
+ * are reported separately for response-spectrum / participation work.
1134
+ */
1135
+ ModalResults: {
1136
+ modes: components["schemas"]["ModeShape"][];
1137
+ };
1138
+ /** @description A single natural vibration mode. */
1139
+ ModeShape: {
1140
+ /**
1141
+ * Format: double
1142
+ * @description Angular frequency `ω` (rad/s).
1143
+ */
1144
+ angular_frequency: number;
1145
+ /**
1146
+ * @description Mode shape: per-node displacement pattern (normalized so the largest
1147
+ * translational component is 1).
1148
+ */
1149
+ displacements: {
1150
+ [key: string]: components["schemas"]["NodeDisplacement"];
1151
+ };
1152
+ /**
1153
+ * @description Effective modal mass per global direction `[X, Y, Z, RX, RY, RZ]`
1154
+ * (`Γ² / (φᵀ·M·φ)`, in kg). The sum across modes approaches the total
1155
+ * free mass of the structure in each direction.
1156
+ */
1157
+ effective_mass: number[];
1158
+ /**
1159
+ * Format: double
1160
+ * @description Eigenvalue `ω²` (rad²/s²).
1161
+ */
1162
+ eigenvalue: number;
1163
+ /**
1164
+ * Format: double
1165
+ * @description Generalized (modal) mass `φᵀ·M·φ` (kg) for the reported, max-translation
1166
+ * normalized shape.
1167
+ */
1168
+ modal_mass: number;
1169
+ /**
1170
+ * Format: int32
1171
+ * @description 1-based mode number (1 = lowest frequency).
1172
+ */
1173
+ mode: number;
1174
+ /**
1175
+ * Format: double
1176
+ * @description Natural frequency `f = ω / 2π` (Hz).
1177
+ */
1178
+ natural_frequency: number;
1179
+ /**
1180
+ * @description Modal participation factor per global direction
1181
+ * `[X, Y, Z, RX, RY, RZ]` (`Γ = φᵀ·M·r`).
1182
+ */
1183
+ participation_factors: number[];
1184
+ /**
1185
+ * Format: double
1186
+ * @description Period `T = 1 / f` (s).
1187
+ */
1188
+ period: number;
1189
+ };
1190
+ /**
1191
+ * @description The structural model: nodes, members, plates and their supporting
1192
+ * definitions (materials, sections, supports, hinges, shape paths).
1193
+ */
1194
+ Model: {
1195
+ materials: components["schemas"]["Material"][];
1196
+ /** @default [] */
1197
+ member_hinges: components["schemas"]["MemberHinge"][];
1198
+ member_sets: components["schemas"]["MemberSet"][];
1199
+ /** @description Single source of truth for member objects. Member sets reference these by id. */
1200
+ members: components["schemas"]["Member"][];
1201
+ nodal_supports: components["schemas"]["NodalSupport"][];
1202
+ nodes: components["schemas"]["Node"][];
1203
+ /** @default [] */
1204
+ plate_elements: components["schemas"]["PlateElement"][];
1205
+ /** @default [] */
1206
+ plate_surfaces: components["schemas"]["PlateSurface"][];
1207
+ sections: components["schemas"]["Section"][];
1208
+ /** @default [] */
1209
+ shape_paths: components["schemas"]["ShapePath"][];
1210
+ /** @default {} */
1211
+ workspace: components["schemas"]["Workspace"];
1212
+ };
1213
+ /** @description Modal response spectrum analysis results (§4.3.3.3). */
1214
+ MrsaResults: {
1215
+ /** @description Final envelope after directional combination. */
1216
+ combined: components["schemas"]["Results"];
1217
+ /** @description Per excitation direction (base shear, modal-mass table, per-direction envelope). */
1218
+ per_direction: components["schemas"]["SeismicDirectionResult"][];
1219
+ };
1220
+ /** @description A concentrated force applied at a node. */
1221
+ NodalLoad: {
1222
+ direction: components["schemas"]["Vector3"];
1223
+ /** Format: int32 */
1224
+ id: number;
1225
+ load_type: components["schemas"]["LoadType"];
1226
+ /** Format: double */
1227
+ magnitude: number;
1228
+ /** Format: int32 */
1229
+ node: number;
1230
+ };
1231
+ /** @description A concentrated moment applied at a node. */
1232
+ NodalMoment: {
1233
+ direction: components["schemas"]["Vector3"];
1234
+ /** Format: int32 */
1235
+ id: number;
1236
+ load_type: components["schemas"]["LoadType"];
1237
+ /** Format: double */
1238
+ magnitude: number;
1239
+ /** Format: int32 */
1240
+ node: number;
1241
+ };
1242
+ /**
1243
+ * @description Boundary conditions at a node: per-axis translation/rotation conditions plus
1244
+ * optional warping. Each condition is in the **global** frame; an absent
1245
+ * (`None`) field means that DOF is free.
1246
+ */
1247
+ NodalSupport: {
1248
+ RX?: null | components["schemas"]["SupportCondition"];
1249
+ RY?: null | components["schemas"]["SupportCondition"];
1250
+ RZ?: null | components["schemas"]["SupportCondition"];
1251
+ X?: null | components["schemas"]["SupportCondition"];
1252
+ Y?: null | components["schemas"]["SupportCondition"];
1253
+ Z?: null | components["schemas"]["SupportCondition"];
1254
+ /** @description Free-text label for the modeler/UI; not used by the solver. */
1255
+ classification?: string | null;
1256
+ /** Format: int32 */
1257
+ id: number;
1258
+ warping_condition?: null | components["schemas"]["SupportCondition"];
1259
+ };
1260
+ /** @description A model node with global coordinates and an optional support. */
1261
+ Node: {
1262
+ /** Format: double */
1263
+ X: number;
1264
+ /** Format: double */
1265
+ Y: number;
1266
+ /** Format: double */
1267
+ Z: number;
1268
+ /** Format: int32 */
1269
+ id: number;
1270
+ /** Format: int32 */
1271
+ nodal_support?: number | null;
1272
+ };
1273
+ /** @description Nodal displacement result (translations, rotations and warping). */
1274
+ NodeDisplacement: {
1275
+ /** Format: double */
1276
+ dx: number;
1277
+ /** Format: double */
1278
+ dy: number;
1279
+ /** Format: double */
1280
+ dz: number;
1281
+ /** Format: double */
1282
+ rx: number;
1283
+ /** Format: double */
1284
+ ry: number;
1285
+ /** Format: double */
1286
+ rz: number;
1287
+ /** Format: double */
1288
+ warp?: number;
1289
+ };
1290
+ /**
1291
+ * @description A 6-DOF force/moment set (plus warping bimoment) in a given frame (global or
1292
+ * member-local, set by the field that owns it). Axial is tension-positive.
1293
+ */
1294
+ NodeForces: {
1295
+ /**
1296
+ * Format: double
1297
+ * @description Warping bimoment ([F·L²]).
1298
+ */
1299
+ bw?: number;
1300
+ /**
1301
+ * Format: double
1302
+ * @description Axial force (tension-positive).
1303
+ */
1304
+ fx: number;
1305
+ /**
1306
+ * Format: double
1307
+ * @description Shear force about the local/global y axis.
1308
+ */
1309
+ fy: number;
1310
+ /**
1311
+ * Format: double
1312
+ * @description Shear force about the local/global z axis.
1313
+ */
1314
+ fz: number;
1315
+ /**
1316
+ * Format: double
1317
+ * @description Torsional moment about the x axis.
1318
+ */
1319
+ mx: number;
1320
+ /**
1321
+ * Format: double
1322
+ * @description Bending moment about the y axis.
1323
+ */
1324
+ my: number;
1325
+ /**
1326
+ * Format: double
1327
+ * @description Bending moment about the z axis.
1328
+ */
1329
+ mz: number;
1330
+ };
1331
+ /** @description A node's global coordinates within a result. */
1332
+ NodeLocation: {
1333
+ /** Format: double */
1334
+ X: number;
1335
+ /** Format: double */
1336
+ Y: number;
1337
+ /** Format: double */
1338
+ Z: number;
1339
+ };
1340
+ /**
1341
+ * @description Controls the nonlinear formulation used for second-order analysis.
1342
+ *
1343
+ * - **PDelta**: Total-Lagrangian P-Δ. Geometric stiffness is added to the
1344
+ * original-frame elastic stiffness. This is the approach used by most
1345
+ * commercial solvers. Accurate for moderate
1346
+ * rotations (< ~10°) but increasingly approximate for larger rotations.
1347
+ *
1348
+ * - **Corotational** (default): Load-incremental corotational Newton-Raphson.
1349
+ * The element frame tracks the deformed geometry, so internal forces and
1350
+ * equilibrium are self-consistent even for large rotations (> 15°).
1351
+ * For small rotations the results converge to P-Delta.
1352
+ *
1353
+ * Python:
1354
+ * class NonlinearMethod(Enum):
1355
+ * P_DELTA = "P_DELTA"
1356
+ * COROTATIONAL = "COROTATIONAL"
1357
+ * @enum {string}
1358
+ */
1359
+ NonlinearMethod: "P_DELTA" | "COROTATIONAL";
1360
+ /**
1361
+ * @description Orthotropic in-plane/bending material properties for plates, expressed in the
1362
+ * plate's local axes (x = `local_x_direction`, y in-plane perpendicular).
1363
+ */
1364
+ OrthotropicPlateMaterial: {
1365
+ /**
1366
+ * Format: double
1367
+ * @description Young's modulus along local x.
1368
+ */
1369
+ e_x: number;
1370
+ /**
1371
+ * Format: double
1372
+ * @description Young's modulus along local y.
1373
+ */
1374
+ e_y: number;
1375
+ /**
1376
+ * Format: double
1377
+ * @description In-plane shear modulus.
1378
+ */
1379
+ g_xy: number;
1380
+ /**
1381
+ * Format: double
1382
+ * @description Transverse shear modulus (x–z); used by Mindlin/thick plates.
1383
+ */
1384
+ g_xz?: number | null;
1385
+ /**
1386
+ * Format: double
1387
+ * @description Transverse shear modulus (y–z); used by Mindlin/thick plates.
1388
+ */
1389
+ g_yz?: number | null;
1390
+ /**
1391
+ * Format: double
1392
+ * @description Major Poisson's ratio (ν_xy); ν_yx is derived from `e_x·ν_yx = e_y·ν_xy`.
1393
+ */
1394
+ nu_xy: number;
1395
+ };
1396
+ /**
1397
+ * @description The kind of drawing operation a [`ShapeCommand`] performs.
1398
+ * @enum {string}
1399
+ */
1400
+ PathCommand: "moveTo" | "lineTo" | "arcTo" | "closePath";
1401
+ /**
1402
+ * @description Controls the geometric stiffness (K_g) formulation for P-Delta analysis.
1403
+ *
1404
+ * - **Consistent** (default): Full Przemieniecki K_g with 6/5·P/L translation
1405
+ * terms, bending-axial rotational coupling (P/10, PL/15, PL/30), and
1406
+ * Wagner torsion. Most accurate near buckling and for lateral-torsional
1407
+ * stability; captures both global P-Δ and local P-δ effects.
1408
+ *
1409
+ * - **Simplified**: Diagonal P/L terms for transverse translations only —
1410
+ * no rotational coupling, no Wagner torsion. Matches the P-Delta
1411
+ * formulation used by most commercial solvers.
1412
+ * Captures global P-Δ (sway) but not local P-δ (member curvature).
1413
+ *
1414
+ * Python:
1415
+ * class PdeltaFormulation(Enum):
1416
+ * CONSISTENT = "CONSISTENT"
1417
+ * SIMPLIFIED = "SIMPLIFIED"
1418
+ * @enum {string}
1419
+ */
1420
+ PdeltaFormulation: "CONSISTENT" | "SIMPLIFIED";
1421
+ /**
1422
+ * @description Controls the P-Delta amplification strategy.
1423
+ *
1424
+ * - **Full** (default): All 3D translational directions are amplified by
1425
+ * geometric stiffness. Most rigorous for general 3D structures.
1426
+ *
1427
+ * - **InPlaneOnly**: Automatically detects the structural plane from the
1428
+ * model's bounding box and suppresses P-Delta amplification in the
1429
+ * thinnest (out-of-plane) direction. Matches the in-plane-only sway
1430
+ * approach used by most commercial solvers.
1431
+ * If the model is truly 3D (all three axes have similar extent), no
1432
+ * axis is suppressed.
1433
+ *
1434
+ * Python:
1435
+ * class PdeltaMode(Enum):
1436
+ * FULL = "FULL"
1437
+ * IN_PLANE_ONLY = "IN_PLANE_ONLY"
1438
+ * @enum {string}
1439
+ */
1440
+ PdeltaMode: "FULL" | "IN_PLANE_ONLY";
1441
+ /**
1442
+ * @description In-plane (membrane) constitutive assumption.
1443
+ * @enum {string}
1444
+ */
1445
+ PlaneState: "PlaneStress" | "PlaneStrain";
1446
+ /**
1447
+ * @description Structural behavior of a plate.
1448
+ *
1449
+ * - `Shell` (default): in-plane (membrane) + out-of-plane (bending) behavior.
1450
+ * - `Membrane`: in-plane only; useful for panels, diaphragms, or fabric-like
1451
+ * surfaces. Bending stiffness and bending resultants are suppressed.
1452
+ * @enum {string}
1453
+ */
1454
+ PlateBehavior: "Shell" | "Membrane";
1455
+ /** @description A generated finite element of a plate mesh (3-node triangle or 4-node quad). */
1456
+ PlateElement: {
1457
+ /** @default Shell */
1458
+ behavior: components["schemas"]["PlateBehavior"];
1459
+ /** Format: int32 */
1460
+ id: number;
1461
+ local_x_direction?: components["schemas"]["Vector3"];
1462
+ /** Format: int32 */
1463
+ material: number;
1464
+ /** @description Element connectivity: 3 nodes (triangle) or 4 nodes (quad). */
1465
+ node_ids: number[];
1466
+ /**
1467
+ * Format: double
1468
+ * @description Distance from the reference surface along the local plate normal.
1469
+ * @default 0
1470
+ */
1471
+ offset: number;
1472
+ /**
1473
+ * @description In-plane constitutive assumption (plane stress/strain).
1474
+ * @default PlaneStress
1475
+ */
1476
+ plane_state: components["schemas"]["PlaneState"];
1477
+ /**
1478
+ * Format: int32
1479
+ * @description The `PlateSurface` this element was meshed from, if any.
1480
+ */
1481
+ source_surface_id?: number | null;
1482
+ stiffness_modifiers?: null | components["schemas"]["PlateStiffnessModifiers"];
1483
+ /**
1484
+ * @description Finite-element theory (thin/thick/auto).
1485
+ * @default Auto
1486
+ */
1487
+ theory: components["schemas"]["PlateTheory"];
1488
+ /** Format: double */
1489
+ thickness: number;
1490
+ };
1491
+ /**
1492
+ * @description Preferred generated element shape when meshing a [`super::platesurface::PlateSurface`].
1493
+ * @enum {string}
1494
+ */
1495
+ PlateElementShape: "Auto" | "Triangle" | "Quad";
1496
+ /** @description Division counts for a structured (u, v) mesh. */
1497
+ PlateMeshDivisions: {
1498
+ /** Format: int32 */
1499
+ u: number;
1500
+ /** Format: int32 */
1501
+ v: number;
1502
+ };
1503
+ /**
1504
+ * @description Meshing algorithm for a plate surface.
1505
+ *
1506
+ * - `Auto`: solver chooses (currently Delaunay).
1507
+ * - `Structured`: transfinite quad grid; requires a 4-edge boundary and
1508
+ * [`PlateMeshDivisions`].
1509
+ * - `Unstructured`: force the Delaunay mesher.
1510
+ * @enum {string}
1511
+ */
1512
+ PlateMeshMethod: "Auto" | "Structured" | "Unstructured";
1513
+ /** @description Mesh generation settings for a plate surface. */
1514
+ PlateMeshSettings: {
1515
+ divisions?: null | components["schemas"]["PlateMeshDivisions"];
1516
+ /** @default Auto */
1517
+ element_shape: components["schemas"]["PlateElementShape"];
1518
+ /** @default Auto */
1519
+ method: components["schemas"]["PlateMeshMethod"];
1520
+ /**
1521
+ * Format: double
1522
+ * @description Target element edge length. `None` meshes the boundary as-is (no interior
1523
+ * refinement).
1524
+ */
1525
+ target_size?: number | null;
1526
+ };
1527
+ /**
1528
+ * @description A hole in a plate surface. The mesher generates elements around it; the
1529
+ * opening's boundary is part of the original surface geometry, not the elements.
1530
+ */
1531
+ PlateOpening: {
1532
+ /** @description Hole boundary (≥ 3 existing model nodes). */
1533
+ boundary_node_ids: number[];
1534
+ /** Format: int32 */
1535
+ id: number;
1536
+ };
1537
+ /**
1538
+ * @description A pressure load applied directly to a modeled plate surface or a single
1539
+ * generated plate element. Distinct from [`super::surfaceload::SurfaceLoad`],
1540
+ * which applies a load over an arbitrary polygon.
1541
+ */
1542
+ PlatePressure: {
1543
+ direction: components["schemas"]["Vector3"];
1544
+ /** Format: int32 */
1545
+ id: number;
1546
+ /** Format: double */
1547
+ magnitude: number;
1548
+ /**
1549
+ * @description When true the pressure acts on the area projected onto `direction`
1550
+ * (e.g. snow), otherwise on the true element area.
1551
+ * @default false
1552
+ */
1553
+ projected: boolean;
1554
+ /** @description What the pressure is applied to — exactly one of a surface or an element. */
1555
+ target: components["schemas"]["PlatePressureTarget"];
1556
+ };
1557
+ /**
1558
+ * @description The target of a [`PlatePressure`]. A tagged union so exactly one target kind
1559
+ * is set (replaces the previous pair of nullable ids).
1560
+ */
1561
+ PlatePressureTarget: {
1562
+ /** @enum {string} */
1563
+ kind: "Surface";
1564
+ /** Format: int32 */
1565
+ surface_id: number;
1566
+ } | {
1567
+ /** @enum {string} */
1568
+ kind: "Element";
1569
+ /** Format: int32 */
1570
+ plate_element_id: number;
1571
+ };
1572
+ /** @description Per-plate-element result (stress resultants). */
1573
+ PlateResult: {
1574
+ centroid: components["schemas"]["NodeLocation"];
1575
+ centroid_displacement_global: components["schemas"]["NodeDisplacement"];
1576
+ centroid_displacement_local: components["schemas"]["NodeDisplacement"];
1577
+ nodal_forces_global: {
1578
+ [key: string]: components["schemas"]["NodeForces"];
1579
+ };
1580
+ /** Format: int32 */
1581
+ plate_id: number;
1582
+ resultants: components["schemas"]["PlateResultants"];
1583
+ };
1584
+ /** @description Plate stress resultants: membrane forces, bending moments and transverse shears. */
1585
+ PlateResultants: {
1586
+ /** Format: double */
1587
+ mx: number;
1588
+ /** Format: double */
1589
+ mxy: number;
1590
+ /** Format: double */
1591
+ my: number;
1592
+ /** Format: double */
1593
+ nx: number;
1594
+ /** Format: double */
1595
+ nxy: number;
1596
+ /** Format: double */
1597
+ ny: number;
1598
+ /** Format: double */
1599
+ qx: number;
1600
+ /** Format: double */
1601
+ qy: number;
1602
+ };
1603
+ /**
1604
+ * @description Optional per-plate stiffness scale factors (e.g. cracked-concrete, composite
1605
+ * or reduced-stiffness modeling). Each defaults to `1.0` (unmodified).
1606
+ */
1607
+ PlateStiffnessModifiers: {
1608
+ /** Format: double */
1609
+ bending?: number;
1610
+ /** Format: double */
1611
+ membrane?: number;
1612
+ /** Format: double */
1613
+ shear?: number;
1614
+ };
1615
+ /**
1616
+ * @description A plate-element stress measure (FEM/plate checks).
1617
+ * @enum {string}
1618
+ */
1619
+ PlateStressMeasure: "VonMises" | "PrincipalMax" | "PrincipalMin";
1620
+ /**
1621
+ * @description A user-modeled plate surface (slab / wall / panel) that is meshed into
1622
+ * [`super::plateelement::PlateElement`]s by the solver.
1623
+ */
1624
+ PlateSurface: {
1625
+ /** @default Shell */
1626
+ behavior: components["schemas"]["PlateBehavior"];
1627
+ /** @description Outer boundary, referencing existing model nodes (counter-clockwise). */
1628
+ boundary_node_ids: number[];
1629
+ classification?: string | null;
1630
+ /**
1631
+ * @description Ids of the plate elements generated from this surface. Populated by the
1632
+ * mesher; any input value is ignored (derived from element
1633
+ * `source_surface_id`).
1634
+ * @default []
1635
+ */
1636
+ readonly generated_plate_element_ids: number[];
1637
+ /** Format: int32 */
1638
+ id: number;
1639
+ local_x_direction?: components["schemas"]["Vector3"];
1640
+ /** Format: int32 */
1641
+ material: number;
1642
+ mesh?: null | components["schemas"]["PlateMeshSettings"];
1643
+ /**
1644
+ * Format: int32
1645
+ * @description Surfaces sharing a `mesh_group_id` are meshed together so coincident
1646
+ * boundary nodes are shared between them.
1647
+ */
1648
+ mesh_group_id?: number | null;
1649
+ name?: string | null;
1650
+ /**
1651
+ * Format: double
1652
+ * @description Distance from the reference surface along the local plate normal.
1653
+ * @default 0
1654
+ */
1655
+ offset: number;
1656
+ /**
1657
+ * @description Holes in the surface; the mesher generates elements around them.
1658
+ * @default []
1659
+ */
1660
+ openings: components["schemas"]["PlateOpening"][];
1661
+ /**
1662
+ * @description In-plane constitutive assumption (plane stress/strain).
1663
+ * @default PlaneStress
1664
+ */
1665
+ plane_state: components["schemas"]["PlaneState"];
1666
+ stiffness_modifiers?: null | components["schemas"]["PlateStiffnessModifiers"];
1667
+ /**
1668
+ * @description Finite-element theory (thin/thick/auto).
1669
+ * @default Auto
1670
+ */
1671
+ theory: components["schemas"]["PlateTheory"];
1672
+ /** Format: double */
1673
+ thickness: number;
1674
+ };
1675
+ /**
1676
+ * @description Plate finite-element theory.
1677
+ *
1678
+ * - `Kirchhoff`: thin-plate (no transverse shear deformation). Current default
1679
+ * formulation (DKT bending element).
1680
+ * - `Mindlin`: thick-plate (Reissner–Mindlin, includes transverse shear).
1681
+ * - `Auto`: the solver chooses based on span/thickness.
1682
+ * @enum {string}
1683
+ */
1684
+ PlateTheory: "Auto" | "Mindlin" | "Kirchhoff";
1685
+ /** @enum {string} */
1686
+ PressureUnit: "Pa" | "kPa" | "MPa" | "GPa";
1687
+ /** @description A bindable quantity — the source of a `{{variable}}` in a unity-check formula. */
1688
+ QuantitySource: {
1689
+ /**
1690
+ * @description A local member force, reduced by `aggregation` and enveloped over the
1691
+ * check's applicable load combinations.
1692
+ */
1693
+ MemberForce: {
1694
+ aggregation?: components["schemas"]["Aggregation"];
1695
+ component: components["schemas"]["MemberForceComponent"];
1696
+ of?: components["schemas"]["EntityTarget"];
1697
+ };
1698
+ } | {
1699
+ /** @description A nodal displacement of the entity (member end / governing node). */
1700
+ Displacement: {
1701
+ component: components["schemas"]["DispComponent"];
1702
+ };
1703
+ } | {
1704
+ /**
1705
+ * @description Displacement (or rotation) of a node named relative to the entity — its own
1706
+ * ends, or the paired member/node via `reference_member` / `reference_node`.
1707
+ * Compose two of these for relative drift / differential settlement.
1708
+ */
1709
+ NodeDisplacement: {
1710
+ at: components["schemas"]["EntityNodeRef"];
1711
+ component: components["schemas"]["DispComponent"];
1712
+ };
1713
+ } | {
1714
+ /**
1715
+ * @description Deflected position (undeformed coordinate + displacement) of a node named
1716
+ * relative to the entity, along a global axis. For clearance / "below a line"
1717
+ * checks: compare two positions to get the deflected gap.
1718
+ */
1719
+ NodePosition: {
1720
+ at: components["schemas"]["EntityNodeRef"];
1721
+ axis: components["schemas"]["Axis"];
1722
+ };
1723
+ } | {
1724
+ /**
1725
+ * @description Transverse deflection relative to the entity's end-to-end chord
1726
+ * (support-to-support for a member-set). Removes support settlement and rigid
1727
+ * chord rotation, leaving the member's own sag — the quantity SLS deflection
1728
+ * limits (e.g. `span/200`) are written against. The deflected shape is
1729
+ * reconstructed by cubic Hermite interpolation and reduced by `aggregation`.
1730
+ */
1731
+ MemberDeflection: {
1732
+ aggregation?: components["schemas"]["Aggregation"];
1733
+ component: components["schemas"]["DeflectionComponent"];
1734
+ };
1735
+ } | {
1736
+ /** @description A property of the entity's (or its reference member's) section. */
1737
+ Section: {
1738
+ of?: components["schemas"]["EntityTarget"];
1739
+ property: components["schemas"]["SectionProperty"];
1740
+ };
1741
+ } | {
1742
+ /** @description A property of the entity's (or its reference member's) material. */
1743
+ Material: {
1744
+ of?: components["schemas"]["EntityTarget"];
1745
+ property: components["schemas"]["MaterialProperty"];
1746
+ };
1747
+ } | {
1748
+ /** @description A geometric quantity of the entity (or its reference member). */
1749
+ Geometry: {
1750
+ of?: components["schemas"]["EntityTarget"];
1751
+ property: components["schemas"]["GeometryProperty"];
1752
+ };
1753
+ } | {
1754
+ /** @description A plate-element stress measure (for plate-targeted checks). */
1755
+ PlateStress: {
1756
+ measure: components["schemas"]["PlateStressMeasure"];
1757
+ };
1758
+ } | {
1759
+ /**
1760
+ * Format: double
1761
+ * @description A literal, dimensionless constant — rendered raw (no unit, no scaling) in
1762
+ * the report trace. Use [`QuantitySource::DimensionedConstant`] instead when
1763
+ * the constant is compared against a dimensioned quantity (a moment capacity,
1764
+ * a deflection limit, …) so the trace stays unit-consistent.
1765
+ */
1766
+ Constant: number;
1767
+ } | {
1768
+ /**
1769
+ * @description A literal constant tagged with its physical [`ConstantDimension`]. The
1770
+ * `value` is given in **SI** units for that dimension; the report trace then
1771
+ * scales and labels it exactly like the quantities it is compared against, so
1772
+ * the `substituted` arithmetic stays consistent with the computed value and
1773
+ * both sides of a demand/capacity ratio share a unit. (A moment capacity of
1774
+ * 2 kN·m → `{ value: 2000.0, dimension: "Moment" }`.)
1775
+ */
1776
+ DimensionedConstant: {
1777
+ dimension: components["schemas"]["ConstantDimension"];
1778
+ /** Format: double */
1779
+ value: number;
1780
+ };
1781
+ };
1782
+ /** @description Support reaction at a node (forces, location and support id). */
1783
+ ReactionNodeResult: {
1784
+ location: components["schemas"]["NodeLocation"];
1785
+ nodal_forces: components["schemas"]["NodeForces"];
1786
+ /** Format: int32 */
1787
+ support_id: number;
1788
+ };
1789
+ /**
1790
+ * @description Design response spectrum definition. Externally tagged: exactly one of the
1791
+ * three variants.
1792
+ */
1793
+ ResponseSpectrum: {
1794
+ /**
1795
+ * @description EN 1998-1 parametric: shape parameters (S, Tb, Tc, Td) are looked up from
1796
+ * the ground type + spectrum type, scaled by `ag` and the behaviour factor
1797
+ * `q`.
1798
+ */
1799
+ EurocodeParametric: {
1800
+ /**
1801
+ * Format: double
1802
+ * @description Design ground acceleration on type-A ground, `a_g = γ_I·a_gR` [m/s²].
1803
+ */
1804
+ ag: number;
1805
+ /**
1806
+ * Format: double
1807
+ * @description Lower-bound factor `β` for the design spectrum (default 0.2).
1808
+ */
1809
+ beta?: number;
1810
+ ground_type: components["schemas"]["GroundType"];
1811
+ /**
1812
+ * Format: double
1813
+ * @description Behaviour factor `q` (≥ 1).
1814
+ */
1815
+ q: number;
1816
+ spectrum_type: components["schemas"]["SpectrumType"];
1817
+ };
1818
+ } | {
1819
+ /** @description Direct spectrum parameters (no preset lookup); national-annex agnostic. */
1820
+ DirectParameters: {
1821
+ /** Format: double */
1822
+ ag: number;
1823
+ /** Format: double */
1824
+ beta?: number;
1825
+ /** Format: double */
1826
+ q: number;
1827
+ /** Format: double */
1828
+ s: number;
1829
+ /** Format: double */
1830
+ tb: number;
1831
+ /** Format: double */
1832
+ tc: number;
1833
+ /** Format: double */
1834
+ td: number;
1835
+ };
1836
+ } | {
1837
+ /**
1838
+ * @description Arbitrary `(period, spectral_acceleration)` table [s, m/s²], linearly
1839
+ * interpolated (clamped beyond the ends).
1840
+ */
1841
+ CustomPoints: {
1842
+ points: number[][];
1843
+ };
1844
+ };
1845
+ ResultType: {
1846
+ /** Format: int32 */
1847
+ Loadcase: number;
1848
+ } | {
1849
+ /** Format: int32 */
1850
+ Loadcombination: number;
1851
+ };
1852
+ /** @description Results for a single load case or combination: displacements, reactions, member and plate results. */
1853
+ Results: {
1854
+ displacement_nodes: {
1855
+ [key: string]: components["schemas"]["NodeDisplacement"];
1856
+ };
1857
+ /**
1858
+ * @description Solver diagnostics (errors/warnings) for this load case/combination.
1859
+ * Empty in the common case.
1860
+ */
1861
+ errors_and_warnings?: components["schemas"]["ErrorsAndWarnings"];
1862
+ member_results: {
1863
+ [key: string]: components["schemas"]["MemberResult"];
1864
+ };
1865
+ name: string;
1866
+ plate_results?: {
1867
+ [key: string]: components["schemas"]["PlateResult"];
1868
+ };
1869
+ reaction_nodes: {
1870
+ [key: string]: components["schemas"]["ReactionNodeResult"];
1871
+ };
1872
+ result_type: components["schemas"]["ResultType"];
1873
+ /**
1874
+ * @description How the solve for this load case/combination ran (iterations, time,
1875
+ * convergence). See [`SolverDiagnostics`].
1876
+ */
1877
+ solver_diagnostics?: components["schemas"]["SolverDiagnostics"];
1878
+ summary: components["schemas"]["ResultsSummary"];
1879
+ };
1880
+ /** @description All analysis results: per load case, per load combination, unity-check results and the optional HTML report. */
1881
+ ResultsBundle: {
1882
+ buckling?: null | components["schemas"]["BucklingResults"];
1883
+ loadcases: {
1884
+ [key: string]: components["schemas"]["Results"];
1885
+ };
1886
+ loadcombinations: {
1887
+ [key: string]: components["schemas"]["Results"];
1888
+ };
1889
+ modal?: null | components["schemas"]["ModalResults"];
1890
+ /**
1891
+ * @description Optional single consolidated HTML report (populated only when requested
1892
+ * via the CLI `--report` flag or `AnalysisOptions.include_report_html`).
1893
+ */
1894
+ report_html?: string | null;
1895
+ seismic?: null | components["schemas"]["SeismicResults"];
1896
+ /**
1897
+ * @description Unity-check results (one entry per check definition), enveloped over the
1898
+ * applicable load combinations.
1899
+ * @default []
1900
+ */
1901
+ unity_check_results: components["schemas"]["UnityCheckResult"][];
1902
+ };
1903
+ /** @description Counts of the result quantities produced (displacements, reactions, member/plate forces). */
1904
+ ResultsSummary: {
1905
+ total_displacements: number;
1906
+ total_member_forces: number;
1907
+ total_plate_forces?: number;
1908
+ total_reaction_forces: number;
1909
+ };
1910
+ /** @enum {string} */
1911
+ RigidStrategy: "LinearMpc" | "RigidMember";
1912
+ /** @description A cross-section: area, second moments, torsion/warping constants, shear areas, optional section moduli and EC3 design parameters. */
1913
+ Section: {
1914
+ /**
1915
+ * Format: double
1916
+ * @description Effective shear area in Y-direction (m²). None = no shear deformation (Euler-Bernoulli).
1917
+ */
1918
+ a_sy?: number | null;
1919
+ /**
1920
+ * Format: double
1921
+ * @description Effective shear area in Z-direction (m²). None = no shear deformation (Euler-Bernoulli).
1922
+ */
1923
+ a_sz?: number | null;
1924
+ /** Format: double */
1925
+ area: number;
1926
+ /** Format: double */
1927
+ b?: number | null;
1928
+ /**
1929
+ * Format: double
1930
+ * @description Centroid Y-coordinate within the shape path coordinate system (mm).
1931
+ * Used by the viewer to offset shape-path extrusions so the centroid
1932
+ * aligns with the member node. Not used by the solver.
1933
+ */
1934
+ centroid_y?: number | null;
1935
+ /**
1936
+ * Format: double
1937
+ * @description Centroid Z-coordinate within the shape path coordinate system (mm).
1938
+ */
1939
+ centroid_z?: number | null;
1940
+ ec3?: null | components["schemas"]["Ec3SectionParams"];
1941
+ /** Format: double */
1942
+ h?: number | null;
1943
+ /**
1944
+ * Format: double
1945
+ * @description Warping constant (m⁶). None = no warping (pure St. Venant torsion).
1946
+ */
1947
+ i_w?: number | null;
1948
+ /** Format: double */
1949
+ i_y: number;
1950
+ /**
1951
+ * Format: double
1952
+ * @description Product of inertia about centroidal axes (mm⁴ in JSON, scaled to m⁴ by solver).
1953
+ * Non-zero for asymmetric sections (e.g. angle, C-channel with unequal flanges).
1954
+ * When present and non-zero, the solver auto-detects whether `i_y`/`i_z`
1955
+ * are centroidal or principal values (by checking angle consistency) and
1956
+ * applies or skips the principal-axis rotation accordingly.
1957
+ */
1958
+ i_yz?: number | null;
1959
+ /** Format: double */
1960
+ i_z: number;
1961
+ /** Format: int32 */
1962
+ id: number;
1963
+ /** Format: double */
1964
+ j: number;
1965
+ /** Format: int32 */
1966
+ material: number;
1967
+ name: string;
1968
+ /**
1969
+ * Format: double
1970
+ * @description Angle (degrees) from centroidal to principal axes.
1971
+ * When `i_yz` is absent or zero, this angle is used to rotate the
1972
+ * stiffness matrix from principal to centroidal frame. When `i_yz`
1973
+ * is present, the solver checks whether `i_y`/`i_z` are centroidal
1974
+ * (angle matches formula) or principal (rotation applied).
1975
+ * Positive = counter-clockwise. Default 0.
1976
+ */
1977
+ principal_axis_angle?: number | null;
1978
+ /** Format: int32 */
1979
+ shape_path?: number | null;
1980
+ /**
1981
+ * Format: double
1982
+ * @description Wagner coefficient for lateral-torsional buckling.
1983
+ */
1984
+ wagner_coeff?: number | null;
1985
+ /**
1986
+ * Format: double
1987
+ * @description Elastic section modulus about the y (major) axis (m³). Universal property
1988
+ * (≡ AISC `S_x`); used by unity checks for bending capacity.
1989
+ */
1990
+ wel_y?: number | null;
1991
+ /**
1992
+ * Format: double
1993
+ * @description Elastic section modulus about the z (minor) axis (m³).
1994
+ */
1995
+ wel_z?: number | null;
1996
+ /**
1997
+ * Format: double
1998
+ * @description Plastic section modulus about the y (major) axis (m³, ≡ AISC `Z_x`).
1999
+ */
2000
+ wpl_y?: number | null;
2001
+ /**
2002
+ * Format: double
2003
+ * @description Plastic section modulus about the z (minor) axis (m³).
2004
+ */
2005
+ wpl_z?: number | null;
2006
+ /**
2007
+ * Format: double
2008
+ * @description Shear center Y-coordinate relative to centroid (m).
2009
+ */
2010
+ y_s?: number | null;
2011
+ /**
2012
+ * Format: double
2013
+ * @description Shear center Z-coordinate relative to centroid (m).
2014
+ */
2015
+ z_s?: number | null;
2016
+ };
2017
+ /** @description Forces at an intermediate cross-section along a member, in local member axes. */
2018
+ SectionForce: {
2019
+ /** @description Internal forces at this section, in the member local centroidal frame. */
2020
+ forces: components["schemas"]["NodeForces"];
2021
+ /**
2022
+ * Format: double
2023
+ * @description Fractional position along the member from the start node, in `[0, 1]`.
2024
+ */
2025
+ x_frac: number;
2026
+ };
2027
+ /**
2028
+ * @description A section property (universal; see [`crate::models::members::section::Section`]).
2029
+ * @enum {string}
2030
+ */
2031
+ SectionProperty: "Area" | "Iy" | "Iz" | "J" | "Iw" | "WelY" | "WelZ" | "WplY" | "WplZ" | "H" | "B" | "Asy" | "Asz";
2032
+ /** @description Request for a seismic analysis (MRSA and/or lateral force). */
2033
+ SeismicAnalysisSettings: {
2034
+ /**
2035
+ * Format: double
2036
+ * @description Viscous damping ratio `ξ` for the CQC correlation (default 0.05).
2037
+ * @default 0.05
2038
+ */
2039
+ damping: number;
2040
+ /** @description Directional combination rule (default SRSS). */
2041
+ directional_combination?: components["schemas"]["DirectionalCombination"];
2042
+ /** @description Excitation directions to analyze (default `[X, Y]`). */
2043
+ directions?: components["schemas"]["SeismicDirection"][];
2044
+ /**
2045
+ * @description Include structural self-mass (density·area + weight override) in the
2046
+ * seismic mass. Default true.
2047
+ * @default true
2048
+ */
2049
+ include_structural_mass: boolean;
2050
+ /** @description Structural mass-matrix formulation (Consistent default, Lumped optional). */
2051
+ mass_formulation?: components["schemas"]["MassFormulation"];
2052
+ /** @description Gravity load cases converted to seismic mass (`ΣG + ψE·Q`). */
2053
+ mass_sources?: components["schemas"]["SeismicMassSource"][];
2054
+ /**
2055
+ * Format: int32
2056
+ * @description Maximum subspace-iteration sweeps (default 100).
2057
+ */
2058
+ max_iterations?: number | null;
2059
+ method: components["schemas"]["SeismicMethod"];
2060
+ /** @description Modal combination rule (default CQC). */
2061
+ modal_combination?: components["schemas"]["ModalCombination"];
2062
+ /**
2063
+ * Format: int32
2064
+ * @description Number of vibration modes to extract for MRSA.
2065
+ */
2066
+ num_modes: number;
2067
+ /** @description Design spectrum for the X excitation direction. */
2068
+ spectrum_x: components["schemas"]["ResponseSpectrum"];
2069
+ spectrum_y?: null | components["schemas"]["ResponseSpectrum"];
2070
+ spectrum_z?: null | components["schemas"]["ResponseSpectrum"];
2071
+ /**
2072
+ * Format: double
2073
+ * @description Eigen convergence tolerance (default 1e-6).
2074
+ */
2075
+ tolerance?: number | null;
2076
+ };
2077
+ /**
2078
+ * @description A global excitation direction.
2079
+ * @enum {string}
2080
+ */
2081
+ SeismicDirection: "X" | "Y" | "Z";
2082
+ /** @description Seismic response for a single excitation direction. */
2083
+ SeismicDirectionResult: {
2084
+ /**
2085
+ * Format: double
2086
+ * @description Combined base shear in this direction (force units).
2087
+ */
2088
+ base_shear: number;
2089
+ /** @description Combined response for this direction alone (before directional combination). */
2090
+ combined: components["schemas"]["Results"];
2091
+ direction: components["schemas"]["SeismicDirection"];
2092
+ /** @description Per-mode contributions (empty for the lateral-force method). */
2093
+ modes?: components["schemas"]["SeismicModeContribution"][];
2094
+ /**
2095
+ * Format: double
2096
+ * @description Σ effective modal mass / total mass — the EN 1998-1 §4.3.3.3.1(3) ≥0.90
2097
+ * check (1.0 for the lateral-force method).
2098
+ */
2099
+ participating_mass_ratio: number;
2100
+ /**
2101
+ * Format: double
2102
+ * @description Total seismic mass excited in this direction (kg).
2103
+ */
2104
+ total_seismic_mass: number;
2105
+ };
2106
+ /**
2107
+ * @description A gravity load case that contributes to the seismic mass with a combination
2108
+ * factor (`ψE,i` for variable actions, `1.0` for permanent `G`).
2109
+ */
2110
+ SeismicMassSource: {
2111
+ /** Format: int32 */
2112
+ load_case_id: number;
2113
+ /**
2114
+ * Format: double
2115
+ * @description Combination factor `ψE` (EN 1998-1 §3.2.4 / §4.2.4). Use 1.0 for permanent loads.
2116
+ */
2117
+ psi: number;
2118
+ };
2119
+ /**
2120
+ * @description Which seismic method(s) to run.
2121
+ * @enum {string}
2122
+ */
2123
+ SeismicMethod: "MODAL_RESPONSE_SPECTRUM" | "LATERAL_FORCE" | "BOTH";
2124
+ /** @description A single mode's contribution to the response in one direction. */
2125
+ SeismicModeContribution: {
2126
+ /**
2127
+ * Format: double
2128
+ * @description Modal base shear `Γ²·Sd(T)` (force units).
2129
+ */
2130
+ base_shear: number;
2131
+ /**
2132
+ * Format: double
2133
+ * @description Effective modal mass `Γ²` (kg).
2134
+ */
2135
+ effective_mass: number;
2136
+ /**
2137
+ * Format: double
2138
+ * @description Effective modal mass / total seismic mass in this direction.
2139
+ */
2140
+ effective_mass_ratio: number;
2141
+ /** Format: int32 */
2142
+ mode: number;
2143
+ /**
2144
+ * Format: double
2145
+ * @description Modal participation factor `Γ = φ̂ᵀ·M·r` for this direction (mass-normalized `φ̂`).
2146
+ */
2147
+ participation_factor: number;
2148
+ /**
2149
+ * Format: double
2150
+ * @description Natural period `T = 2π/ω` (s).
2151
+ */
2152
+ period: number;
2153
+ /**
2154
+ * Format: double
2155
+ * @description Design spectral acceleration `Sd(T)` (m/s²).
2156
+ */
2157
+ spectral_acceleration: number;
2158
+ };
2159
+ /**
2160
+ * @description Seismic analysis results (EN 1998-1): modal response spectrum and/or
2161
+ * lateral-force outputs. Forces/displacements/reactions are in the model's
2162
+ * units; periods in seconds, spectral accelerations in m/s², masses in kg.
2163
+ */
2164
+ SeismicResults: {
2165
+ lateral_force?: null | components["schemas"]["LateralForceResults"];
2166
+ modal_response_spectrum?: null | components["schemas"]["MrsaResults"];
2167
+ };
2168
+ /** @description Top-level settings: general project info and the unit system. */
2169
+ Settings: {
2170
+ general_info: components["schemas"]["GeneralInfo"];
2171
+ unit_settings: components["schemas"]["UnitSettings"];
2172
+ };
2173
+ /** @description A single command in a cross-section shape path (move/line/arc). */
2174
+ ShapeCommand: {
2175
+ /** Format: double */
2176
+ center_y?: number | null;
2177
+ /** Format: double */
2178
+ center_z?: number | null;
2179
+ command: components["schemas"]["PathCommand"];
2180
+ /** Format: double */
2181
+ r?: number | null;
2182
+ /** Format: double */
2183
+ theta0?: number | null;
2184
+ /** Format: double */
2185
+ theta1?: number | null;
2186
+ /** Format: double */
2187
+ y?: number | null;
2188
+ /** Format: double */
2189
+ z?: number | null;
2190
+ };
2191
+ /** @description A 2-D cross-section outline (a sequence of shape commands) used for visualization. */
2192
+ ShapePath: {
2193
+ /** Format: int32 */
2194
+ id: number;
2195
+ name: string;
2196
+ shape_commands: components["schemas"]["ShapeCommand"][];
2197
+ };
2198
+ /**
2199
+ * @description Per-result solver run diagnostics: how the solve for this load case /
2200
+ * combination actually ran. Populated best-effort; fields that are not
2201
+ * meaningful for a given solve path are left `None`.
2202
+ */
2203
+ SolverDiagnostics: {
2204
+ /**
2205
+ * @description Effective analysis method used for this result: `"Linear"`,
2206
+ * `"P_DELTA"`, or `"COROTATIONAL"`.
2207
+ */
2208
+ analysis_method?: string | null;
2209
+ /** @description Whether the solve converged. Linear solves report `true`. */
2210
+ converged?: boolean;
2211
+ /**
2212
+ * Format: int32
2213
+ * @description Total nonlinear (Newton-Raphson / corotational) iterations actually
2214
+ * executed, summed across load steps and active-set/correction outer
2215
+ * loops. `None` for purely linear (first-order) solves.
2216
+ */
2217
+ iterations?: number | null;
2218
+ /**
2219
+ * Format: double
2220
+ * @description Final relative residual norm at convergence (nonlinear solves). `None`
2221
+ * for linear solves where no residual is iterated.
2222
+ */
2223
+ residual_norm?: number | null;
2224
+ /**
2225
+ * Format: double
2226
+ * @description Wall-clock solve time for this result, in milliseconds. `None` when the
2227
+ * time is not individually attributable (e.g. a batch first-order solve
2228
+ * that shares one factorization across many load cases).
2229
+ */
2230
+ solve_time_ms?: number | null;
2231
+ };
2232
+ /**
2233
+ * @description A single solver diagnostic: a stable machine-readable `code` plus a
2234
+ * human-readable `message`. Severity is given by the list it belongs to
2235
+ * (`ErrorsAndWarnings::errors` vs `ErrorsAndWarnings::warnings`).
2236
+ */
2237
+ SolverMessage: {
2238
+ code: string;
2239
+ message: string;
2240
+ };
2241
+ /**
2242
+ * @description EN 1998-1 spectrum type: Type 1 (Ms ≥ 5.5, Table 3.2) or Type 2 (Table 3.3).
2243
+ * @enum {string}
2244
+ */
2245
+ SpectrumType: "TYPE1" | "TYPE2";
2246
+ /** @description A single boundary condition (fixed/free/spring) with optional stiffness or stiffness curve. */
2247
+ SupportCondition: {
2248
+ condition_type: components["schemas"]["SupportConditionType"];
2249
+ /** Format: double */
2250
+ stiffness?: number | null;
2251
+ stiffness_curve?: null | components["schemas"]["SupportStiffnessCurve"];
2252
+ };
2253
+ /** @enum {string} */
2254
+ SupportConditionType: "Fixed" | "Free" | "Spring" | "PositiveOnly" | "NegativeOnly";
2255
+ /**
2256
+ * @description Which global reaction component a **support** stiffness curve depends on.
2257
+ *
2258
+ * Supports react in the global coordinate system, so the names are the global
2259
+ * reaction components `Fx/Fy/Fz` (forces) and `Mx/My/Mz` (moments). Distinct
2260
+ * from [`MemberStiffnessCurveDriver`], whose member-local names (`N/Vy/Vz/…`)
2261
+ * apply to member-hinge stiffness curves.
2262
+ * @enum {string}
2263
+ */
2264
+ SupportForceComponent: "Fx" | "Fy" | "Fz" | "Mx" | "My" | "Mz";
2265
+ /**
2266
+ * @description A **support** spring stiffness that varies with a global reaction component.
2267
+ *
2268
+ * `points` is a sorted list of `[force_value, stiffness]` pairs and `depends_on`
2269
+ * is the global reaction component driving the interpolation.
2270
+ */
2271
+ SupportStiffnessCurve: {
2272
+ /** @description Which global reaction component the stiffness depends on. */
2273
+ depends_on: components["schemas"]["SupportForceComponent"];
2274
+ /** @description Sorted `[force_value, stiffness]` pairs (≥ 2 points, positive stiffness). */
2275
+ points: [
2276
+ number,
2277
+ number
2278
+ ][];
2279
+ /**
2280
+ * @description When `true`, the curve is driven by the SIGNED reaction, so tension and
2281
+ * compression can have different stiffness (points may span negative
2282
+ * force). When `false` (default), the curve is driven by `|force|`
2283
+ * (symmetric — the legacy behaviour).
2284
+ */
2285
+ signed?: boolean;
2286
+ };
2287
+ /** @description A pressure load over an arbitrary polygon, distributed onto the underlying members/plates. */
2288
+ SurfaceLoad: {
2289
+ direction: components["schemas"]["Vector3"];
2290
+ distribution_direction?: components["schemas"]["Vector3"];
2291
+ /** Format: int32 */
2292
+ id: number;
2293
+ /** Format: double */
2294
+ magnitude: number;
2295
+ polygon: components["schemas"]["SurfaceLoadVertex"][];
2296
+ };
2297
+ /** @description A vertex of a surface-load polygon, in the **global** frame (`X`, `Y`, `Z`). */
2298
+ SurfaceLoadVertex: {
2299
+ /** Format: double */
2300
+ X: number;
2301
+ /** Format: double */
2302
+ Y: number;
2303
+ /** Format: double */
2304
+ Z: number;
2305
+ };
2306
+ /**
2307
+ * @description A geometric sway (out-of-plumb) imperfection, applied to the whole model as
2308
+ * imperfect initial geometry.
2309
+ *
2310
+ * `magnitude` is the lean angle in **radians** about `axis`. Every node leans
2311
+ * toward the sway direction `axis × height_direction` by
2312
+ * `magnitude · (height above reference_point)`, where height is measured along
2313
+ * `height_direction`. The `height_direction` component is never displaced, so
2314
+ * nodes on the reference plane stay put (no base lift).
2315
+ *
2316
+ * It applies to the entire model for the load combinations its
2317
+ * [`crate::models::imperfections::imperfectioncase::ImperfectionCase`] targets —
2318
+ * there is no per-member targeting; subdividing or grouping members does not
2319
+ * change the result.
2320
+ */
2321
+ SwayImperfection: {
2322
+ /** @description Rotation axis. The sway direction is `axis × height_direction`. */
2323
+ axis: components["schemas"]["Vector3"];
2324
+ /**
2325
+ * @description Direction along which height is measured and which is never displaced
2326
+ * (the structure's "up"). Defaults to global +Y.
2327
+ */
2328
+ height_direction?: components["schemas"]["Vector3"];
2329
+ /**
2330
+ * Format: double
2331
+ * @description Sway (lean) angle in **radians**, applied about `axis`.
2332
+ */
2333
+ magnitude: number;
2334
+ /**
2335
+ * @description A point on the zero-sway plane: the lean is proportional to a node's
2336
+ * height above this point (along `height_direction`). Only a measurement
2337
+ * reference, not a pivot. Defaults to the origin.
2338
+ */
2339
+ reference_point?: components["schemas"]["Vector3"];
2340
+ };
2341
+ /** @description A translational geometric imperfection along an axis, applied to member sets. */
2342
+ TranslationImperfection: {
2343
+ axis: components["schemas"]["Vector3"];
2344
+ /** Format: double */
2345
+ magnitude: number;
2346
+ memberset_ids: number[];
2347
+ };
2348
+ /** @description The model's unit system (length, force, density, pressure) for input and results. */
2349
+ UnitSettings: {
2350
+ densityUnit?: components["schemas"]["DensityUnit"];
2351
+ forceUnit?: components["schemas"]["ForceUnit"];
2352
+ lengthUnit?: components["schemas"]["LengthUnit"];
2353
+ pressureUnit?: components["schemas"]["PressureUnit"];
2354
+ system?: components["schemas"]["UnitSystem"];
2355
+ };
2356
+ /**
2357
+ * @description The unit system a model is expressed in.
2358
+ * @enum {string}
2359
+ */
2360
+ UnitSystem: "metric" | "imperial";
2361
+ /** @description One unity check the engineer defines. */
2362
+ UnityCheckDefinition: {
2363
+ applies_to: components["schemas"]["EntitySelector"];
2364
+ description?: string | null;
2365
+ id: string;
2366
+ limit_state?: null | components["schemas"]["LimitState"];
2367
+ /**
2368
+ * @description Restrict to these combination ids (empty = all matching `limit_state`).
2369
+ * @default []
2370
+ */
2371
+ load_combination_ids: number[];
2372
+ name: string;
2373
+ /**
2374
+ * @description Optional narrative report template (authored HTML/markdown). Placeholders are
2375
+ * filled from each entity's computed trace: `{{label}}` → that step's display
2376
+ * string (number + unit) and `{{= expr}}` → `expr` evaluated over the trace
2377
+ * values (display units). Rendered into each `EntityUnityResult.rendered_report`
2378
+ * only when `analysis.options.render_unity_reports` is true.
2379
+ */
2380
+ report_template?: string | null;
2381
+ spec: components["schemas"]["CheckSpec"];
2382
+ /**
2383
+ * @description Utilization colour boundaries [green→yellow, yellow→orange, orange→red].
2384
+ * @default [
2385
+ * 0.8,
2386
+ * 0.95,
2387
+ * 1
2388
+ * ]
2389
+ */
2390
+ thresholds: number[];
2391
+ };
2392
+ /** @description All entity results for one check + the governing (worst) one. */
2393
+ UnityCheckResult: {
2394
+ check_id: string;
2395
+ governing?: null | components["schemas"]["EntityUnityResult"];
2396
+ limit_state?: null | components["schemas"]["LimitState"];
2397
+ /** Format: double */
2398
+ max_utilization: number;
2399
+ name: string;
2400
+ /** @default [] */
2401
+ per_entity: components["schemas"]["EntityUnityResult"][];
2402
+ status: components["schemas"]["UnityStatus"];
2403
+ };
2404
+ /**
2405
+ * @description 4-colour utilization status. Derived from utilization vs the check's
2406
+ * thresholds `[green→yellow, yellow→orange, orange→red]`.
2407
+ * @enum {string}
2408
+ */
2409
+ UnityStatus: "Green" | "Yellow" | "Orange" | "Red";
2410
+ /** @description Binds a friendly placeholder name (used in `{{name}}`) to a value source. */
2411
+ VarBinding: {
2412
+ name: string;
2413
+ source: components["schemas"]["VarSource"];
2414
+ };
2415
+ /**
2416
+ * @description The source of a named formula variable: a catalog quantity, or a
2417
+ * sub-expression over previously-declared variables/quantities.
2418
+ */
2419
+ VarSource: {
2420
+ Quantity: components["schemas"]["QuantitySource"];
2421
+ } | {
2422
+ /** @description An expression string (may reference earlier variable names + functions). */
2423
+ Expression: string;
2424
+ };
2425
+ /**
2426
+ * @description A 3-component vector `[x, y, z]`.
2427
+ *
2428
+ * Shared schema referenced (via `#[schema(value_type = Vector3)]`) by every
2429
+ * direction/axis field so the OpenAPI defines one reusable component instead of
2430
+ * repeating the inline array. The Rust model keeps plain `(f64, f64, f64)`
2431
+ * tuples and the JSON shape is unchanged.
2432
+ */
2433
+ Vector3: [
2434
+ number,
2435
+ number,
2436
+ number
2437
+ ];
2438
+ /** @description A construction axis (origin + direction) for the UI/CAD workspace. */
2439
+ WorkAxis: {
2440
+ /** Format: double */
2441
+ direction_x: number;
2442
+ /** Format: double */
2443
+ direction_y: number;
2444
+ /** Format: double */
2445
+ direction_z: number;
2446
+ /** Format: int32 */
2447
+ id: number;
2448
+ name?: string;
2449
+ /** Format: double */
2450
+ origin_x: number;
2451
+ /** Format: double */
2452
+ origin_y: number;
2453
+ /** Format: double */
2454
+ origin_z: number;
2455
+ };
2456
+ /** @description A construction plane (origin + normal) for the UI/CAD workspace. */
2457
+ WorkPlane: {
2458
+ /** Format: int32 */
2459
+ id: number;
2460
+ name?: string;
2461
+ /** Format: double */
2462
+ normal_x: number;
2463
+ /** Format: double */
2464
+ normal_y: number;
2465
+ /** Format: double */
2466
+ normal_z: number;
2467
+ /** Format: double */
2468
+ origin_x: number;
2469
+ /** Format: double */
2470
+ origin_y: number;
2471
+ /** Format: double */
2472
+ origin_z: number;
2473
+ };
2474
+ /**
2475
+ * @description Calculation-agnostic visualization / CAD helpers (not part of the structural
2476
+ * FE model, but useful for the UI and for grouping entities).
2477
+ */
2478
+ Workspace: {
2479
+ /**
2480
+ * @description Generic, calculation-agnostic entity groups for UI/visualization.
2481
+ * @default []
2482
+ */
2483
+ entity_groups: components["schemas"]["EntityGroup"][];
2484
+ /** @default [] */
2485
+ work_axes: components["schemas"]["WorkAxis"][];
2486
+ /** @default [] */
2487
+ work_planes: components["schemas"]["WorkPlane"][];
2488
+ };
2489
+ };
2490
+ responses: never;
2491
+ parameters: never;
2492
+ requestBodies: never;
2493
+ headers: never;
2494
+ pathItems: never;
2495
+ }
2496
+ export type $defs = Record<string, never>;
2497
+ export type operations = Record<string, never>;
2498
+
2499
+ export type FERS = components['schemas']['FERS'];
2500
+ export type ResultsBundle = components['schemas']['ResultsBundle'];