@theerapat-s28/ts-structural-eng-tools 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -6
- package/dist/core/constants/frame.constant.d.ts +5 -0
- package/dist/core/constants/frame.constant.js +6 -1
- package/dist/core/constants/frame.constant.js.map +1 -1
- package/dist/core/errors/frame-analysis.error.d.ts +3 -0
- package/dist/core/errors/frame-analysis.error.js +14 -2
- package/dist/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/esm/core/constants/frame.constant.js +5 -0
- package/dist/esm/core/constants/frame.constant.js.map +1 -1
- package/dist/esm/core/errors/frame-analysis.error.js +14 -2
- package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/frame/area/area-geometry.js +132 -0
- package/dist/esm/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js +267 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/esm/fea/frame/area/edge-members.js +62 -0
- package/dist/esm/fea/frame/area/edge-members.js.map +1 -0
- package/dist/esm/fea/frame/elements/fixed-end-forces.js +16 -3
- package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -1
- package/dist/esm/fea/frame/index.js +1 -0
- package/dist/esm/fea/frame/index.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +71 -28
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/solver/analyze-frame.js +19 -11
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js +21 -7
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-model.js +103 -6
- package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/fea/frame/area/area-geometry.d.ts +56 -0
- package/dist/fea/frame/area/area-geometry.js +142 -0
- package/dist/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/fea/frame/area/distribute-area-loads.d.ts +30 -0
- package/dist/fea/frame/area/distribute-area-loads.js +272 -0
- package/dist/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/fea/frame/area/edge-members.d.ts +25 -0
- package/dist/fea/frame/area/edge-members.js +67 -0
- package/dist/fea/frame/area/edge-members.js.map +1 -0
- package/dist/fea/frame/elements/fixed-end-forces.d.ts +17 -3
- package/dist/fea/frame/elements/fixed-end-forces.js +18 -4
- package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -1
- package/dist/fea/frame/index.d.ts +2 -1
- package/dist/fea/frame/index.js +3 -1
- package/dist/fea/frame/index.js.map +1 -1
- package/dist/fea/frame/post/member-diagram.js +71 -28
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/solver/analyze-frame.d.ts +7 -4
- package/dist/fea/frame/solver/analyze-frame.js +19 -11
- package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/fea/frame/solver/load-case-solver.js +21 -7
- package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +59 -1
- package/dist/fea/frame/validation/validate-model.d.ts +1 -1
- package/dist/fea/frame/validation/validate-model.js +103 -6
- package/dist/fea/frame/validation/validate-model.js.map +1 -1
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -2,7 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
**📖 [API Reference — theerapat-s28.github.io/ts-structural-eng](https://theerapat-s28.github.io/ts-structural-eng/)**
|
|
4
4
|
|
|
5
|
-
A TypeScript
|
|
5
|
+
A headless structural analysis and design engine for TypeScript: 3D frame analysis by the direct stiffness method, reinforced-concrete beam design per ACI 318-19, and strengthening methods. It is built to be installed by front-end applications as their calculation core.
|
|
6
|
+
|
|
7
|
+
## Scope: an engine, not an application
|
|
8
|
+
|
|
9
|
+
The library does the structural engineering and nothing else. A front-end application installs it, builds a model from its own UI, calls the engine, and draws the results.
|
|
10
|
+
|
|
11
|
+
| The engine (this package) | The front-end application |
|
|
12
|
+
| --------------------------------------------------------------------------- | ------------------------------------------------------------- |
|
|
13
|
+
| Model validation with located errors (`details` name the node, member, field…) | Input forms, drawing tools, highlighting the reported problems |
|
|
14
|
+
| Analysis: load cases, combinations, envelopes, member diagrams | Rendering the model, deformed shapes and diagrams |
|
|
15
|
+
| Design checks with code-clause warnings and `RCDesignError` / `FrameAnalysisError` | Display of results, member colours, view and display options |
|
|
16
|
+
| Typed inputs and results in SI units | Unit display, project files, undo history, other UI state |
|
|
17
|
+
|
|
18
|
+
What this means in practice:
|
|
19
|
+
|
|
20
|
+
- **No UI, no rendering, no presentation data.** Inputs and results carry structural quantities only; no colours, labels or view state.
|
|
21
|
+
- **Plain JSON in, plain JSON out.** Models and results are serialisable, so the engine runs in a Web Worker, in the browser or in Node.
|
|
22
|
+
- **No runtime dependencies** and no DOM or Node-only APIs.
|
|
23
|
+
- **ESM and CommonJS builds** with `.d.ts` types, tree-shakeable (`"sideEffects": false`), split into subpath exports (`/fea`, `/rc`, `/strengthening`, `/core`, `/utils`).
|
|
6
24
|
|
|
7
25
|
## Documentation
|
|
8
26
|
|
|
@@ -19,7 +37,7 @@ The pages are served from [`html-docs/`](https://github.com/theerapat-s28/ts-str
|
|
|
19
37
|
|
|
20
38
|
- Package: `@theerapat-s28/ts-structural-eng-tools`
|
|
21
39
|
- Entry: `src/index.ts`
|
|
22
|
-
- Build output: `dist/` (
|
|
40
|
+
- Build output: `dist/` (CommonJS + `.d.ts` files) and `dist/esm/` (ES modules)
|
|
23
41
|
|
|
24
42
|
## Prerequisites
|
|
25
43
|
|
|
@@ -73,15 +91,16 @@ src/
|
|
|
73
91
|
│ ├── index.ts
|
|
74
92
|
│ └── frame/ # 3D frame analysis (direct stiffness method)
|
|
75
93
|
│ ├── index.ts
|
|
94
|
+
│ ├── area/ # Null areas: geometry, edge-member chains, area-load distribution
|
|
76
95
|
│ ├── elements/ # Reference beam stiffness matrix, fixed-end forces, end-release condensation
|
|
77
96
|
│ ├── transformation/ # ETABS-style local axes and the 12×12 transformation
|
|
78
97
|
│ ├── solver/ # System build + skyline factorisation, per-case solve, combinations, analyzeFrame
|
|
79
98
|
│ ├── validation/ # validateFrameModel: every input problem, with its location
|
|
80
99
|
│ ├── post/ # Result presentation, member force diagrams, envelopes, design demands
|
|
81
|
-
│ └── types/ # Model (incl. load cases, combinations) and result types
|
|
100
|
+
│ └── types/ # Model (incl. null areas, load cases, combinations) and result types
|
|
82
101
|
├── core/ # Shared infrastructure
|
|
83
102
|
│ ├── index.ts
|
|
84
|
-
│ ├── constants/ # RC design constants (ACI 318)
|
|
103
|
+
│ ├── constants/ # RC design constants (ACI 318) and frame-analysis tolerances
|
|
85
104
|
│ ├── errors/ # Custom error classes
|
|
86
105
|
│ └── types/ # Shared type definitions
|
|
87
106
|
└── utils/ # Helper utilities
|
|
@@ -155,9 +174,10 @@ ACI 440.2R-17 11.4.2 (spacing, which defers to the ACI 318 limits) and 11.4.3 (`
|
|
|
155
174
|
|
|
156
175
|
Linear-elastic 3D frame analysis by the direct stiffness method, imported from `@theerapat-s28/ts-structural-eng-tools/fea`. Global axes X, Y, Z (Z up) and ETABS-style local axes 1, 2, 3; inputs in mm, MPa, kN and kN·m, results in kN, kN·m, mm and rad.
|
|
157
176
|
|
|
158
|
-
- **`analyzeFrame(model, options?)`** — Analyses every load case in `model.loadCases` (dead, superimposed dead, live, wind…, each with an optional `selfWeight` multiplier) and forms every combination in `model.combinations` by superposition. The loads are flat top-level lists, `model.nodalLoads` and `model.memberLoads` (uniform and point loads in local or global directions), each load tagged with its `loadCase`, so large models stay readable. A combination is a list of factored terms `{ case, factor }` or `{ combination, factor }`; factors are entered by the user, and nested combinations are expanded. Supports end releases and fixed or spring supports. The stiffness matrix is factorised once for all cases. Returns `cases` and `combinations` keyed by id — each with displacements, reactions, member end forces, member diagrams along each member (forces `N`, `V2`, `V3`, `T`, `M2`, `M3` and deflections `u1`–`u3` local / `ux`–`uz` global, ready for plotting) and an equilibrium check — and an `envelope` of max/min over the combinations with the governing combination. Combination diagrams are rebuilt exactly, not summed from case extremes. The stiffness is stored in skyline (banded) form with nodes in reverse Cuthill–McKee order, so a building of ~850 nodes runs in about 1.5 s. Model and result are plain JSON, so it runs in a Web Worker. Invalid models, load cases or combinations and mechanisms throw `FrameAnalysisError` (codes 301–
|
|
177
|
+
- **`analyzeFrame(model, options?)`** — Analyses every load case in `model.loadCases` (dead, superimposed dead, live, wind…, each with an optional `selfWeight` multiplier) and forms every combination in `model.combinations` by superposition. The loads are flat top-level lists, `model.nodalLoads` and `model.memberLoads` (uniform, trapezoidal and point loads in local or global directions, and torques about the member axis), each load tagged with its `loadCase`, so large models stay readable. Area loads (`model.areaLoads`, kN/m²) on null areas (`model.areas`) are first distributed to the members along each area's edges — see `distributeAreaLoads`. A combination is a list of factored terms `{ case, factor }` or `{ combination, factor }`; factors are entered by the user, and nested combinations are expanded. Supports end releases and fixed or spring supports. The stiffness matrix is factorised once for all cases. Returns `cases` and `combinations` keyed by id — each with displacements, reactions, member end forces, member diagrams along each member (forces `N`, `V2`, `V3`, `T`, `M2`, `M3` and deflections `u1`–`u3` local / `ux`–`uz` global, ready for plotting) and an equilibrium check — and an `envelope` of max/min over the combinations with the governing combination. Combination diagrams are rebuilt exactly, not summed from case extremes. The stiffness is stored in skyline (banded) form with nodes in reverse Cuthill–McKee order, so a building of ~850 nodes runs in about 1.5 s. Model and result are plain JSON, so it runs in a Web Worker. Invalid models, load cases or combinations and mechanisms throw `FrameAnalysisError` (codes 301–317) with `details` locating the problem.
|
|
159
178
|
- **`createFrameAnalysis(model, options?)`** — Same analysis, keeping the solution: returns `{ result, memberDiagram(resultId, memberId) }` so full member diagrams can be computed on demand. Combine with `options.diagrams: "extremes"`, which keeps diagram extremes (and the envelope) but drops the station arrays, for results about 4× smaller on large models.
|
|
160
|
-
- **`validateFrameModel(model)`** — Checks a model without analysing it and returns every problem, each with `details` (`nodeId`, `memberId`, `loadCaseId`, `combinationId`, `field`, `dof`) for highlighting in a UI. `analyzeFrame` runs it first and throws the first problem as a `FrameAnalysisError` whose `issues` lists all of them; non-finite numbers, negative springs and unknown option values are rejected (314).
|
|
179
|
+
- **`validateFrameModel(model)`** — Checks a model without analysing it and returns every problem, each with `details` (`nodeId`, `memberId`, `areaId`, `edge`, `loadCaseId`, `combinationId`, `field`, `dof`) for highlighting in a UI. `analyzeFrame` runs it first and throws the first problem as a `FrameAnalysisError` whose `issues` lists all of them; non-finite numbers, negative springs and unknown option values are rejected (314).
|
|
180
|
+
- **`distributeAreaLoads(model)`** — Returns `{ memberLoads, warnings }`: the member loads that the model's null areas send to their edge members, exactly what `analyzeFrame` adds, for checking or previewing. A null area (`{ id, nodeIds, distribution, supportEdges? }`) has 3 or 4 nodes forming a planar convex polygon and adds no stiffness. `"twoWay"` sends each point to its nearest edge (the corner-bisector split, any convex shape); `"oneWay"` spans strips between the listed `supportEdges`, parallel to the unsupported edges, half to each end; `"cantilever"` (rectangles) puts `q·c` and a torque `q·c²/2` on its one support edge. Area loads (`{ loadCase, areaId, direction: "3" | "X" | "Y" | "Z", q }`) are per unit true area, `"3"` being the area's normal. Edges split by intermediate nodes are cut at them. Area problems throw 315 (geometry), 316 (an edge without members) or 317 (supports that do not fit the distribution).
|
|
161
181
|
- **`memberDemandEnvelope(result, memberId, options?)`** — Reduces a member's diagrams to `MuPositive`, `MuNegative`, `Vu` (optionally at distance `d` from the supports) and `Nu`, enveloped over all combinations (or the `combinations` / `cases` you select), with the `governing` combination of each, for the RC capacity functions.
|
|
162
182
|
- **`rectBeamToSectionProperties(section, options?)`** (from `rc`) — Converts a rectangular RC section into `SectionProperties` (`E`, `G`, `A`, `I22`, `I33`, `J`, `unitWeight`) with the ACI 318-19 6.6.3.1.1 inertia modifiers (0.35 beams, 0.70 columns) and a unit weight for self-weight (default 24 kN/m³, common practice rather than an ACI value).
|
|
163
183
|
- **`beam3dLocalStiffness(E, G, A, I22, I33, J, L)`** — The 12×12 local stiffness matrix exactly as in the reference "Complete Beam Stiffness Matrix". Its bending rotations R2 and R3 follow the opposite sign to the right-hand rule; **`beam3dLocalStiffnessRightHanded`** returns the right-handed form that `analyzeFrame` uses.
|
|
@@ -12,3 +12,8 @@ export declare const VERTICAL_MEMBER_TOLERANCE = 0.000001;
|
|
|
12
12
|
export declare const SINGULARITY_TOLERANCE = 1e-9;
|
|
13
13
|
/** Relative global-equilibrium residual above which a warning is added. */
|
|
14
14
|
export declare const EQUILIBRIUM_TOLERANCE = 0.000001;
|
|
15
|
+
/**
|
|
16
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
17
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
18
|
+
*/
|
|
19
|
+
export declare const AREA_GEOMETRY_TOLERANCE = 0.000001;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = exports.CONCRETE_UNIT_WEIGHT = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_POISSON_RATIO = void 0;
|
|
3
|
+
exports.AREA_GEOMETRY_TOLERANCE = exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = exports.CONCRETE_UNIT_WEIGHT = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_POISSON_RATIO = void 0;
|
|
4
4
|
/** Poisson's ratio of concrete, for G = E / (2(1 + ν)). */
|
|
5
5
|
exports.CONCRETE_POISSON_RATIO = 0.2;
|
|
6
6
|
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of beams for elastic analysis at factored load. */
|
|
@@ -15,4 +15,9 @@ exports.VERTICAL_MEMBER_TOLERANCE = 1e-6;
|
|
|
15
15
|
exports.SINGULARITY_TOLERANCE = 1e-9;
|
|
16
16
|
/** Relative global-equilibrium residual above which a warning is added. */
|
|
17
17
|
exports.EQUILIBRIUM_TOLERANCE = 1e-6;
|
|
18
|
+
/**
|
|
19
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
20
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
21
|
+
*/
|
|
22
|
+
exports.AREA_GEOMETRY_TOLERANCE = 1e-6;
|
|
18
23
|
//# sourceMappingURL=frame.constant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAE1C,iGAAiG;AACpF,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,mGAAmG;AACtF,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAE3C,qGAAqG;AACxF,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAEvC,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AAC1F,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC9D,QAAA,qBAAqB,GAAG,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC9C,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAE1C,iGAAiG;AACpF,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,mGAAmG;AACtF,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAE3C,qGAAqG;AACxF,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAEvC,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AAC1F,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC9D,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACU,QAAA,uBAAuB,GAAG,IAAI,CAAC"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
export interface FrameErrorDetails {
|
|
5
5
|
nodeId?: string | number;
|
|
6
6
|
memberId?: string | number;
|
|
7
|
+
areaId?: string | number;
|
|
8
|
+
/** For an area: the edge index, edge i running from `nodeIds[i]` to `nodeIds[i + 1]`. */
|
|
9
|
+
edge?: number;
|
|
7
10
|
loadCaseId?: string;
|
|
8
11
|
combinationId?: string;
|
|
9
12
|
/** The offending input field, e.g. "x", "fz", "w", "direction", "uz". */
|
|
@@ -20,11 +20,11 @@ exports.FrameErrors = {
|
|
|
20
20
|
},
|
|
21
21
|
UNKNOWN_NODE_REFERENCE: {
|
|
22
22
|
code: 302,
|
|
23
|
-
message: "A member, restraint or load refers to a node or
|
|
23
|
+
message: "A member, restraint, area or load refers to a node, member or area id that is not in the model.",
|
|
24
24
|
},
|
|
25
25
|
DUPLICATE_ID: {
|
|
26
26
|
code: 303,
|
|
27
|
-
message: "Node ids, member ids and restrained node ids must each be unique, and load case and combination ids must be unique across both lists.",
|
|
27
|
+
message: "Node ids, member ids, area ids and restrained node ids must each be unique, and load case and combination ids must be unique across both lists.",
|
|
28
28
|
},
|
|
29
29
|
STRUCTURE_UNSTABLE: {
|
|
30
30
|
code: 304,
|
|
@@ -70,5 +70,17 @@ exports.FrameErrors = {
|
|
|
70
70
|
code: 314,
|
|
71
71
|
message: "An input value is invalid: a number that is not finite (NaN, Infinity or not a number), a negative spring stiffness, or a value outside its allowed options.",
|
|
72
72
|
},
|
|
73
|
+
INVALID_AREA_GEOMETRY: {
|
|
74
|
+
code: 315,
|
|
75
|
+
message: "An area must have 3 or 4 distinct nodes forming a planar, convex polygon with no three corners in line; a cantilever area must be a rectangle.",
|
|
76
|
+
},
|
|
77
|
+
AREA_EDGE_UNSUPPORTED: {
|
|
78
|
+
code: 316,
|
|
79
|
+
message: "An area edge that carries load is not fully covered by members: every segment between the nodes along the edge needs a member.",
|
|
80
|
+
},
|
|
81
|
+
INVALID_AREA_DISTRIBUTION: {
|
|
82
|
+
code: 317,
|
|
83
|
+
message: "An area's supportEdges do not fit its distribution: two-way takes none; one-way needs at least one edge left unsupported, with every unsupported edge parallel to the others (the span direction); cantilever needs exactly one, and its loads may not act along that edge.",
|
|
84
|
+
},
|
|
73
85
|
};
|
|
74
86
|
//# sourceMappingURL=frame-analysis.error.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-analysis.error.js","sourceRoot":"","sources":["../../../src/core/errors/frame-analysis.error.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"frame-analysis.error.js","sourceRoot":"","sources":["../../../src/core/errors/frame-analysis.error.ts"],"names":[],"mappings":";;;AAiBA,MAAa,kBAAmB,SAAQ,KAAK;IAO3C,YACE,MAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EACnE,UAA6B,EAAE,EAC/B,MAA0B;QAE1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAnBD,gDAmBC;AAcY,QAAA,WAAW,GAA2C;IACjE,8BAA8B;IAC9B,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sEAAsE;KAChF;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,iGAAiG;KACpG;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG;QACT,OAAO,EACL,iJAAiJ;KACpJ;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,mHAAmH;KACtH;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,iDAAiD;KAC3D;IACD,eAAe,EAAE;QACf,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yFAAyF;KAC5F;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,4EAA4E;KACtF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mDAAmD;KAC7D;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,gEAAgE;KAC1E;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,sHAAsH;KACzH;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,8JAA8J;KACjK;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gJAAgJ;KACnJ;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gIAAgI;KACnI;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,6QAA6Q;KAChR;CACF,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type { SectionProperties } from "./types/section-properties.type";
|
|
|
6
6
|
export type { Warnings, calculationResult } from "./types/output-message.type";
|
|
7
7
|
export type { unit } from "./types/unit.type";
|
|
8
8
|
export { FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, } from "./constants/rc.constant";
|
|
9
|
-
export { CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, } from "./constants/frame.constant";
|
|
9
|
+
export { CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, AREA_GEOMETRY_TOLERANCE, } from "./constants/frame.constant";
|
|
10
10
|
export { RCDesignError, Errors } from "./errors/rc-design.error";
|
|
11
11
|
export { FrameAnalysisError, FrameErrors } from "./errors/frame-analysis.error";
|
|
12
12
|
export type { FrameErrorDetails, FrameModelIssue } from "./errors/frame-analysis.error";
|
package/dist/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FrameErrors = exports.FrameAnalysisError = exports.Errors = exports.RCDesignError = exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_UNIT_WEIGHT = exports.CONCRETE_POISSON_RATIO = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasSidePlate = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = void 0;
|
|
3
|
+
exports.FrameErrors = exports.FrameAnalysisError = exports.Errors = exports.RCDesignError = exports.AREA_GEOMETRY_TOLERANCE = exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_UNIT_WEIGHT = exports.CONCRETE_POISSON_RATIO = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasSidePlate = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = void 0;
|
|
4
4
|
var rc_beam_type_1 = require("./types/rc-beam.type");
|
|
5
5
|
Object.defineProperty(exports, "isSinglyReinforced", { enumerable: true, get: function () { return rc_beam_type_1.isSinglyReinforced; } });
|
|
6
6
|
var plate_jacketing_type_1 = require("./types/plate-jacketing.type");
|
|
@@ -25,6 +25,7 @@ Object.defineProperty(exports, "COLUMN_INERTIA_MODIFIER", { enumerable: true, ge
|
|
|
25
25
|
Object.defineProperty(exports, "VERTICAL_MEMBER_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.VERTICAL_MEMBER_TOLERANCE; } });
|
|
26
26
|
Object.defineProperty(exports, "SINGULARITY_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.SINGULARITY_TOLERANCE; } });
|
|
27
27
|
Object.defineProperty(exports, "EQUILIBRIUM_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.EQUILIBRIUM_TOLERANCE; } });
|
|
28
|
+
Object.defineProperty(exports, "AREA_GEOMETRY_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.AREA_GEOMETRY_TOLERANCE; } });
|
|
28
29
|
// Errors
|
|
29
30
|
var rc_design_error_1 = require("./errors/rc-design.error");
|
|
30
31
|
Object.defineProperty(exports, "RCDesignError", { enumerable: true, get: function () { return rc_design_error_1.RCDesignError; } });
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAW3B,qEAAyF;AAAhF,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAAE,oHAAA,YAAY,OAAA;AAKlD,YAAY;AACZ,uDASiC;AAR/B,iIAAA,kCAAkC,OAAA;AAClC,uHAAA,wBAAwB,OAAA;AACxB,8HAAA,+BAA+B,OAAA;AAC/B,qIAAA,sCAAsC,OAAA;AACtC,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAC7B,gIAAA,iCAAiC,OAAA;AACjC,8HAAA,+BAA+B,OAAA;AAGjC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAW3B,qEAAyF;AAAhF,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAAE,oHAAA,YAAY,OAAA;AAKlD,YAAY;AACZ,uDASiC;AAR/B,iIAAA,kCAAkC,OAAA;AAClC,uHAAA,wBAAwB,OAAA;AACxB,8HAAA,+BAA+B,OAAA;AAC/B,qIAAA,sCAAsC,OAAA;AACtC,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAC7B,gIAAA,iCAAiC,OAAA;AACjC,8HAAA,+BAA+B,OAAA;AAGjC,6DASoC;AARlC,wHAAA,sBAAsB,OAAA;AACtB,sHAAA,oBAAoB,OAAA;AACpB,uHAAA,qBAAqB,OAAA;AACrB,yHAAA,uBAAuB,OAAA;AACvB,2HAAA,yBAAyB,OAAA;AACzB,uHAAA,qBAAqB,OAAA;AACrB,uHAAA,qBAAqB,OAAA;AACrB,yHAAA,uBAAuB,OAAA;AAGzB,SAAS;AACT,4DAAiE;AAAxD,gHAAA,aAAa,OAAA;AAAE,yGAAA,MAAM,OAAA;AAC9B,sEAAgF;AAAvE,0HAAA,kBAAkB,OAAA;AAAE,mHAAA,WAAW,OAAA"}
|
|
@@ -12,4 +12,9 @@ export const VERTICAL_MEMBER_TOLERANCE = 1e-6;
|
|
|
12
12
|
export const SINGULARITY_TOLERANCE = 1e-9;
|
|
13
13
|
/** Relative global-equilibrium residual above which a warning is added. */
|
|
14
14
|
export const EQUILIBRIUM_TOLERANCE = 1e-6;
|
|
15
|
+
/**
|
|
16
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
17
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
18
|
+
*/
|
|
19
|
+
export const AREA_GEOMETRY_TOLERANCE = 1e-6;
|
|
15
20
|
//# sourceMappingURL=frame.constant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,mGAAmG;AACnG,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,qGAAqG;AACrG,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,gGAAgG;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,iGAAiG;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,mGAAmG;AACnG,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C,qGAAqG;AACrG,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,gGAAgG;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC"}
|
|
@@ -16,11 +16,11 @@ export const FrameErrors = {
|
|
|
16
16
|
},
|
|
17
17
|
UNKNOWN_NODE_REFERENCE: {
|
|
18
18
|
code: 302,
|
|
19
|
-
message: "A member, restraint or load refers to a node or
|
|
19
|
+
message: "A member, restraint, area or load refers to a node, member or area id that is not in the model.",
|
|
20
20
|
},
|
|
21
21
|
DUPLICATE_ID: {
|
|
22
22
|
code: 303,
|
|
23
|
-
message: "Node ids, member ids and restrained node ids must each be unique, and load case and combination ids must be unique across both lists.",
|
|
23
|
+
message: "Node ids, member ids, area ids and restrained node ids must each be unique, and load case and combination ids must be unique across both lists.",
|
|
24
24
|
},
|
|
25
25
|
STRUCTURE_UNSTABLE: {
|
|
26
26
|
code: 304,
|
|
@@ -66,5 +66,17 @@ export const FrameErrors = {
|
|
|
66
66
|
code: 314,
|
|
67
67
|
message: "An input value is invalid: a number that is not finite (NaN, Infinity or not a number), a negative spring stiffness, or a value outside its allowed options.",
|
|
68
68
|
},
|
|
69
|
+
INVALID_AREA_GEOMETRY: {
|
|
70
|
+
code: 315,
|
|
71
|
+
message: "An area must have 3 or 4 distinct nodes forming a planar, convex polygon with no three corners in line; a cantilever area must be a rectangle.",
|
|
72
|
+
},
|
|
73
|
+
AREA_EDGE_UNSUPPORTED: {
|
|
74
|
+
code: 316,
|
|
75
|
+
message: "An area edge that carries load is not fully covered by members: every segment between the nodes along the edge needs a member.",
|
|
76
|
+
},
|
|
77
|
+
INVALID_AREA_DISTRIBUTION: {
|
|
78
|
+
code: 317,
|
|
79
|
+
message: "An area's supportEdges do not fit its distribution: two-way takes none; one-way needs at least one edge left unsupported, with every unsupported edge parallel to the others (the span direction); cantilever needs exactly one, and its loads may not act along that edge.",
|
|
80
|
+
},
|
|
69
81
|
};
|
|
70
82
|
//# sourceMappingURL=frame-analysis.error.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-analysis.error.js","sourceRoot":"","sources":["../../../../src/core/errors/frame-analysis.error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame-analysis.error.js","sourceRoot":"","sources":["../../../../src/core/errors/frame-analysis.error.ts"],"names":[],"mappings":"AAiBA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAO3C,YACE,MAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EACnE,UAA6B,EAAE,EAC/B,MAA0B;QAE1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAcD,MAAM,CAAC,MAAM,WAAW,GAA2C;IACjE,8BAA8B;IAC9B,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sEAAsE;KAChF;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,iGAAiG;KACpG;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG;QACT,OAAO,EACL,iJAAiJ;KACpJ;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,mHAAmH;KACtH;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,iDAAiD;KAC3D;IACD,eAAe,EAAE;QACf,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yFAAyF;KAC5F;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,4EAA4E;KACtF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mDAAmD;KAC7D;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,gEAAgE;KAC1E;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,sHAAsH;KACzH;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,8JAA8J;KACjK;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gJAAgJ;KACnJ;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gIAAgI;KACnI;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,6QAA6Q;KAChR;CACF,CAAC"}
|
package/dist/esm/core/index.js
CHANGED
|
@@ -2,7 +2,7 @@ export { isSinglyReinforced } from "./types/rc-beam.type.js";
|
|
|
2
2
|
export { hasTopPlate, hasBottomPlate, hasSidePlate } from "./types/plate-jacketing.type.js";
|
|
3
3
|
// Constants
|
|
4
4
|
export { FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, } from "./constants/rc.constant.js";
|
|
5
|
-
export { CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, } from "./constants/frame.constant.js";
|
|
5
|
+
export { CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, AREA_GEOMETRY_TOLERANCE, } from "./constants/frame.constant.js";
|
|
6
6
|
// Errors
|
|
7
7
|
export { RCDesignError, Errors } from "./errors/rc-design.error.js";
|
|
8
8
|
export { FrameAnalysisError, FrameErrors } from "./errors/frame-analysis.error.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAW1D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAKzF,YAAY;AACZ,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,+BAA+B,EAC/B,sCAAsC,EACtC,sBAAsB,EACtB,6BAA6B,EAC7B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAW1D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAKzF,YAAY;AACZ,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,+BAA+B,EAC/B,sCAAsC,EACtC,sBAAsB,EACtB,6BAA6B,EAC7B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { AREA_GEOMETRY_TOLERANCE } from "../../../core/constants/frame.constant.js";
|
|
2
|
+
const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
3
|
+
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
4
|
+
const cross = (a, b) => [
|
|
5
|
+
a[1] * b[2] - a[2] * b[1],
|
|
6
|
+
a[2] * b[0] - a[0] * b[2],
|
|
7
|
+
a[0] * b[1] - a[1] * b[0],
|
|
8
|
+
];
|
|
9
|
+
const norm = (a) => Math.hypot(a[0], a[1], a[2]);
|
|
10
|
+
const scale = (a, s) => [a[0] * s, a[1] * s, a[2] * s];
|
|
11
|
+
const cross2 = (a, b) => a[0] * b[1] - a[1] * b[0];
|
|
12
|
+
const dot2 = (a, b) => a[0] * b[0] + a[1] * b[1];
|
|
13
|
+
/** The 2D edge vector i → i + 1 of a polygon. */
|
|
14
|
+
export const edgeVector = (corners, i) => {
|
|
15
|
+
const a = corners[i];
|
|
16
|
+
const b = corners[(i + 1) % corners.length];
|
|
17
|
+
return [b[0] - a[0], b[1] - a[1]];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Builds the plane of an area from its corners, or names the problem: not 3 or 4 corners,
|
|
21
|
+
* two consecutive corners coinciding, no area, corners off one plane, or a polygon that is
|
|
22
|
+
* not strictly convex (a reflex corner, three corners in line or a crossed quad).
|
|
23
|
+
*
|
|
24
|
+
* @param points - Corner coordinates in mm, in order around the area
|
|
25
|
+
*/
|
|
26
|
+
export const areaPlane = (points) => {
|
|
27
|
+
const n = points.length;
|
|
28
|
+
if (n !== 3 && n !== 4)
|
|
29
|
+
return { problem: "nodeCount" };
|
|
30
|
+
const edges = points.map((p, i) => sub(points[(i + 1) % n], p));
|
|
31
|
+
const size = Math.max(...edges.map(norm));
|
|
32
|
+
const tolerance = AREA_GEOMETRY_TOLERANCE * size;
|
|
33
|
+
if (!(size > 0) || edges.some((e) => norm(e) <= tolerance))
|
|
34
|
+
return { problem: "repeatedNode" };
|
|
35
|
+
// Newell's method: the vector area, exact for a planar polygon
|
|
36
|
+
const vectorArea = points.reduce((sum, p, i) => {
|
|
37
|
+
const c = cross(p, points[(i + 1) % n]);
|
|
38
|
+
return [sum[0] + c[0] / 2, sum[1] + c[1] / 2, sum[2] + c[2] / 2];
|
|
39
|
+
}, [0, 0, 0]);
|
|
40
|
+
const area = norm(vectorArea);
|
|
41
|
+
if (!(area > tolerance * size))
|
|
42
|
+
return { problem: "degenerate" };
|
|
43
|
+
const normal = scale(vectorArea, 1 / area);
|
|
44
|
+
const centroid = scale(points.reduce((s, p) => [s[0] + p[0], s[1] + p[1], s[2] + p[2]], [0, 0, 0]), 1 / n);
|
|
45
|
+
if (points.some((p) => Math.abs(dot(sub(p, centroid), normal)) > tolerance)) {
|
|
46
|
+
return { problem: "nonPlanar" };
|
|
47
|
+
}
|
|
48
|
+
const along = sub(edges[0], scale(normal, dot(edges[0], normal)));
|
|
49
|
+
const u = scale(along, 1 / norm(along));
|
|
50
|
+
const v = cross(normal, u);
|
|
51
|
+
const corners = points.map((p) => [dot(sub(p, points[0]), u), dot(sub(p, points[0]), v)]);
|
|
52
|
+
// Strictly convex: every turn is to the left by more than the tolerance (sine of the turn)
|
|
53
|
+
for (let i = 0; i < n; i++) {
|
|
54
|
+
const a = edgeVector(corners, i);
|
|
55
|
+
const b = edgeVector(corners, (i + 1) % n);
|
|
56
|
+
if (!(cross2(a, b) > AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b))) {
|
|
57
|
+
return { problem: "nonConvex" };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { points, normal, u, v, corners, area, size };
|
|
61
|
+
};
|
|
62
|
+
/** Whether edges i and j are parallel (either way round) within the tolerance. */
|
|
63
|
+
export const edgesParallel = (plane, i, j) => {
|
|
64
|
+
const a = edgeVector(plane.corners, i);
|
|
65
|
+
const b = edgeVector(plane.corners, j);
|
|
66
|
+
return Math.abs(cross2(a, b)) <= AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b);
|
|
67
|
+
};
|
|
68
|
+
/** Whether a 4-corner area is a rectangle (every corner square within the tolerance). */
|
|
69
|
+
export const isRectangle = (plane) => plane.corners.length === 4 &&
|
|
70
|
+
plane.corners.every((_, i) => {
|
|
71
|
+
const a = edgeVector(plane.corners, i);
|
|
72
|
+
const b = edgeVector(plane.corners, (i + 1) % 4);
|
|
73
|
+
return Math.abs(dot2(a, b)) <= AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b);
|
|
74
|
+
});
|
|
75
|
+
/** Unit vector of edge i in global coordinates. */
|
|
76
|
+
export const edgeDirection = (plane, i) => {
|
|
77
|
+
const n = plane.points.length;
|
|
78
|
+
const d = sub(plane.points[(i + 1) % n], plane.points[i]);
|
|
79
|
+
return scale(d, 1 / norm(d));
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Resolves which edges of an area receive load from its distribution and `supportEdges`.
|
|
83
|
+
* Two-way loads every edge and takes no `supportEdges`. One-way spans parallel to the edges
|
|
84
|
+
* not listed, which must exist and all be parallel; cantilever takes exactly one edge.
|
|
85
|
+
*
|
|
86
|
+
* @returns The loaded edges, or `null` if `supportEdges` does not fit the distribution
|
|
87
|
+
*/
|
|
88
|
+
export const resolveAreaSupports = (plane, distribution, supportEdges) => {
|
|
89
|
+
const n = plane.corners.length;
|
|
90
|
+
if (distribution === "twoWay") {
|
|
91
|
+
return supportEdges === undefined ? { loadedEdges: [...Array(n).keys()] } : null;
|
|
92
|
+
}
|
|
93
|
+
if (!Array.isArray(supportEdges) ||
|
|
94
|
+
supportEdges.length === 0 ||
|
|
95
|
+
supportEdges.some((e) => !Number.isInteger(e) || e < 0 || e >= n) ||
|
|
96
|
+
new Set(supportEdges).size !== supportEdges.length) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
const loadedEdges = [...supportEdges].sort((a, b) => a - b);
|
|
100
|
+
if (distribution === "cantilever")
|
|
101
|
+
return loadedEdges.length === 1 ? { loadedEdges } : null;
|
|
102
|
+
const free = [...Array(n).keys()].filter((e) => !loadedEdges.includes(e));
|
|
103
|
+
if (free.length === 0 || free.some((e) => !edgesParallel(plane, free[0], e)))
|
|
104
|
+
return null;
|
|
105
|
+
const d = edgeVector(plane.corners, free[0]);
|
|
106
|
+
const length = Math.hypot(...d);
|
|
107
|
+
return { loadedEdges, span: [d[0] / length, d[1] / length] };
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Clips a convex polygon to the half-plane `a · p ≤ c` (Sutherland–Hodgman, one plane).
|
|
111
|
+
*
|
|
112
|
+
* @param polygon - Corners in order, mm
|
|
113
|
+
* @returns The clipped polygon, in the same order; empty if nothing remains
|
|
114
|
+
*/
|
|
115
|
+
export const clipPolygon = (polygon, a, c) => {
|
|
116
|
+
const out = [];
|
|
117
|
+
const side = (p) => dot2(a, p) - c;
|
|
118
|
+
for (let i = 0; i < polygon.length; i++) {
|
|
119
|
+
const p = polygon[i];
|
|
120
|
+
const q = polygon[(i + 1) % polygon.length];
|
|
121
|
+
const sp = side(p);
|
|
122
|
+
const sq = side(q);
|
|
123
|
+
if (sp <= 0)
|
|
124
|
+
out.push(p);
|
|
125
|
+
if ((sp < 0 && sq > 0) || (sp > 0 && sq < 0)) {
|
|
126
|
+
const t = sp / (sp - sq);
|
|
127
|
+
out.push([p[0] + t * (q[0] - p[0]), p[1] + t * (q[1] - p[1])]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=area-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-geometry.js","sourceRoot":"","sources":["../../../../../src/fea/frame/area/area-geometry.ts"],"names":[],"mappings":"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"}
|