ocs-calculators 0.1.3 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +10 -10
  2. package/dist/anchor-length/index.cjs +11 -0
  3. package/dist/anchor-length/index.cjs.map +1 -0
  4. package/dist/anchor-length/index.d.cts +45 -0
  5. package/dist/anchor-length/index.d.ts +45 -0
  6. package/dist/anchor-length/index.js +11 -0
  7. package/dist/anchor-length/index.js.map +1 -0
  8. package/dist/bvalue/index.cjs +9 -0
  9. package/dist/bvalue/index.cjs.map +1 -0
  10. package/dist/bvalue/index.d.cts +35 -0
  11. package/dist/bvalue/index.d.ts +35 -0
  12. package/dist/bvalue/index.js +9 -0
  13. package/dist/bvalue/index.js.map +1 -0
  14. package/dist/cantilever/index.cjs +11 -0
  15. package/dist/cantilever/index.cjs.map +1 -0
  16. package/dist/cantilever/index.d.cts +31 -0
  17. package/dist/cantilever/index.d.ts +31 -0
  18. package/dist/cantilever/index.js +11 -0
  19. package/dist/cantilever/index.js.map +1 -0
  20. package/dist/chunk-3GREMF76.js +44 -0
  21. package/dist/chunk-3GREMF76.js.map +1 -0
  22. package/dist/chunk-4344WWAF.cjs +58 -0
  23. package/dist/chunk-4344WWAF.cjs.map +1 -0
  24. package/dist/chunk-57J7I6JA.cjs +116 -0
  25. package/dist/chunk-57J7I6JA.cjs.map +1 -0
  26. package/dist/chunk-75EGROQB.js +53 -0
  27. package/dist/chunk-75EGROQB.js.map +1 -0
  28. package/dist/chunk-C2XU3XKP.js +46 -0
  29. package/dist/chunk-C2XU3XKP.js.map +1 -0
  30. package/dist/chunk-CLVLOLUJ.js +45 -0
  31. package/dist/chunk-CLVLOLUJ.js.map +1 -0
  32. package/dist/chunk-CSLI5HEJ.cjs +53 -0
  33. package/dist/chunk-CSLI5HEJ.cjs.map +1 -0
  34. package/dist/chunk-D5F5ES2R.js +163 -0
  35. package/dist/chunk-D5F5ES2R.js.map +1 -0
  36. package/dist/chunk-HXALVJ4G.cjs +44 -0
  37. package/dist/chunk-HXALVJ4G.cjs.map +1 -0
  38. package/dist/chunk-HZWNKKIB.js +42 -0
  39. package/dist/chunk-HZWNKKIB.js.map +1 -0
  40. package/dist/chunk-LBGUOTCJ.cjs +45 -0
  41. package/dist/chunk-LBGUOTCJ.cjs.map +1 -0
  42. package/dist/chunk-PYNVEHGR.cjs +46 -0
  43. package/dist/chunk-PYNVEHGR.cjs.map +1 -0
  44. package/dist/chunk-TO46PTS3.js +116 -0
  45. package/dist/chunk-TO46PTS3.js.map +1 -0
  46. package/dist/chunk-VXVTT6WS.js +58 -0
  47. package/dist/chunk-VXVTT6WS.js.map +1 -0
  48. package/dist/chunk-WGTOBRYV.cjs +42 -0
  49. package/dist/chunk-WGTOBRYV.cjs.map +1 -0
  50. package/dist/chunk-X25CXRVE.cjs +163 -0
  51. package/dist/chunk-X25CXRVE.cjs.map +1 -0
  52. package/dist/creepage/index.cjs +15 -0
  53. package/dist/creepage/index.cjs.map +1 -0
  54. package/dist/creepage/index.d.cts +40 -0
  55. package/dist/creepage/index.d.ts +40 -0
  56. package/dist/creepage/index.js +15 -0
  57. package/dist/creepage/index.js.map +1 -0
  58. package/dist/cross-span/index.cjs +9 -0
  59. package/dist/cross-span/index.cjs.map +1 -0
  60. package/dist/cross-span/index.d.cts +68 -0
  61. package/dist/cross-span/index.d.ts +68 -0
  62. package/dist/cross-span/index.js +9 -0
  63. package/dist/cross-span/index.js.map +1 -0
  64. package/dist/index.cjs +77 -9
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +8 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.js +86 -18
  69. package/dist/index.js.map +1 -1
  70. package/dist/pole-capacity/index.cjs +13 -0
  71. package/dist/pole-capacity/index.cjs.map +1 -0
  72. package/dist/pole-capacity/index.d.cts +47 -0
  73. package/dist/pole-capacity/index.d.ts +47 -0
  74. package/dist/pole-capacity/index.js +13 -0
  75. package/dist/pole-capacity/index.js.map +1 -0
  76. package/dist/sag/index.cjs +13 -0
  77. package/dist/sag/index.cjs.map +1 -0
  78. package/dist/sag/index.d.cts +21 -0
  79. package/dist/sag/index.d.ts +21 -0
  80. package/dist/sag/index.js +13 -0
  81. package/dist/sag/index.js.map +1 -0
  82. package/dist/steady-arm/index.cjs +11 -0
  83. package/dist/steady-arm/index.cjs.map +1 -0
  84. package/dist/steady-arm/index.d.cts +66 -0
  85. package/dist/steady-arm/index.d.ts +66 -0
  86. package/dist/steady-arm/index.js +11 -0
  87. package/dist/steady-arm/index.js.map +1 -0
  88. package/package.json +43 -3
package/CHANGELOG.md CHANGED
@@ -1,19 +1,19 @@
1
+ # 更新日志
2
+
3
+ 本文件格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
4
+ 版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。
5
+
1
6
  ## [0.1.3] - 2026-09-07
2
7
 
3
8
  ### 修复
4
9
 
5
- - **型号代码规范化**: 与铜计算器的型号键由 H 前置误写形态
6
- ( / / )统一为站内规范写法 ** / / **
10
+ - **型号代码规范化**:`COPPER_TABLE` 与铜计算器的型号键由 H 前置误写形态
11
+ (`CTHM` / `CTHA` / `CTHS`)统一为站内规范写法 **`CTMH` / `CTAH` / `CTS`**
7
12
  (H 后置构词,与 TB/T 2809-2026 牌号体系及站点词条口径一致)。
8
- ⚠️ 破坏性变更:以旧键字符串调用 copper 相关函数的调用方需同步改名,
13
+ 破坏性变更:以旧键字符串调用 copper 相关函数的调用方需同步改名,
9
14
  旧键传入会得到「未知型号」错误。
10
- - 同日已在站点部署侧(itswe 与 7 个计算器页)
11
- 完成相同归一,并修复 7 页输入控件的畸形 uid=197609(showhoo) gid=197609 groups=197609 属性(曾致 JS 绑定整体失效)。
12
-
13
- # 更新日志
14
-
15
- 本文件格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
16
- 版本号遵循[语义化版本](https://semver.org/lang/zh-CN/)。
15
+ - 同日已在站点部署侧(itswe `calculator/assets/calc-core.js` 与 7 个计算器页)
16
+ 完成相同归一,并修复 7 页输入控件的畸形 `id` 属性(曾致 JS 绑定整体失效)。
17
17
 
18
18
  ## [0.1.2] - 2026-09-06
19
19
 
@@ -0,0 +1,11 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+ var _chunkCSLI5HEJcjs = require('../chunk-CSLI5HEJ.cjs');
6
+
7
+
8
+
9
+
10
+ exports.TENSION_DIFF_RATIO = _chunkCSLI5HEJcjs.TENSION_DIFF_RATIO; exports.anchorLengthCheck = _chunkCSLI5HEJcjs.anchorLengthCheck; exports.anchorLengthMeta = _chunkCSLI5HEJcjs.anchorLengthMeta;
11
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/anchor-length/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACF,kMAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/anchor-length/index.cjs"}
@@ -0,0 +1,45 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.cjs';
2
+
3
+ declare const anchorLengthMeta: CalculatorMeta;
4
+
5
+ /** 张力增量判据(TB 10009-2016 第 5.4.7 条) */
6
+ declare const TENSION_DIFF_RATIO = 0.1;
7
+ /** 锚段张力增量计算参数(教材口径,直线吊弦项量纲已复核)。单位:m、kN、1/℃、℃。 */
8
+ interface AnchorLengthInput {
9
+ /** 区段类型:'line' 直线 | 'curve' 曲线 */
10
+ readonly section: 'line' | 'curve';
11
+ /** 接触线额定张力 T_N,kN(判据基准) */
12
+ readonly ratedTensionKN: number;
13
+ /** 半锚段长度 L(中心锚结至补偿器),m */
14
+ readonly halfSpanM?: number;
15
+ /** 曲线半径 R,m(曲线区段) */
16
+ readonly curveRadiusM?: number;
17
+ /** 定位器长度 d,m(曲线区段) */
18
+ readonly regulatorLengthM?: number;
19
+ /** 定位器数量 n(曲线区段) */
20
+ readonly regulatorCount?: number;
21
+ /** 跨距 l,m(直线吊弦项) */
22
+ readonly spanM?: number;
23
+ /** 吊弦平均长度 c,m(直线吊弦项) */
24
+ readonly dropperLengthM?: number;
25
+ /** 接触线单位重 g_j,kN/m(直线吊弦项) */
26
+ readonly wireWeightKNPerM?: number;
27
+ /** 线胀系数 α,1/℃(直线吊弦项) */
28
+ readonly expansionCoeff?: number;
29
+ /** 计算温差 Δt,℃(直线吊弦项) */
30
+ readonly tempDeltaC?: number;
31
+ }
32
+ interface AnchorLengthResult {
33
+ /** 张力增量,N */
34
+ readonly deltaN: number;
35
+ /** 判据限值 10%·T_N,N */
36
+ readonly limitN: number;
37
+ /** 张力差占额定张力比例 */
38
+ readonly ratio: number;
39
+ /** 是否合格(ΔT ≤ 10%·T_N) */
40
+ readonly passes: boolean;
41
+ }
42
+ /** 锚段张力增量(教材口径)与 10% 判据校核 */
43
+ declare function anchorLengthCheck(input: AnchorLengthInput): AnchorLengthResult;
44
+
45
+ export { type AnchorLengthInput, type AnchorLengthResult, TENSION_DIFF_RATIO, anchorLengthCheck, anchorLengthMeta };
@@ -0,0 +1,45 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.js';
2
+
3
+ declare const anchorLengthMeta: CalculatorMeta;
4
+
5
+ /** 张力增量判据(TB 10009-2016 第 5.4.7 条) */
6
+ declare const TENSION_DIFF_RATIO = 0.1;
7
+ /** 锚段张力增量计算参数(教材口径,直线吊弦项量纲已复核)。单位:m、kN、1/℃、℃。 */
8
+ interface AnchorLengthInput {
9
+ /** 区段类型:'line' 直线 | 'curve' 曲线 */
10
+ readonly section: 'line' | 'curve';
11
+ /** 接触线额定张力 T_N,kN(判据基准) */
12
+ readonly ratedTensionKN: number;
13
+ /** 半锚段长度 L(中心锚结至补偿器),m */
14
+ readonly halfSpanM?: number;
15
+ /** 曲线半径 R,m(曲线区段) */
16
+ readonly curveRadiusM?: number;
17
+ /** 定位器长度 d,m(曲线区段) */
18
+ readonly regulatorLengthM?: number;
19
+ /** 定位器数量 n(曲线区段) */
20
+ readonly regulatorCount?: number;
21
+ /** 跨距 l,m(直线吊弦项) */
22
+ readonly spanM?: number;
23
+ /** 吊弦平均长度 c,m(直线吊弦项) */
24
+ readonly dropperLengthM?: number;
25
+ /** 接触线单位重 g_j,kN/m(直线吊弦项) */
26
+ readonly wireWeightKNPerM?: number;
27
+ /** 线胀系数 α,1/℃(直线吊弦项) */
28
+ readonly expansionCoeff?: number;
29
+ /** 计算温差 Δt,℃(直线吊弦项) */
30
+ readonly tempDeltaC?: number;
31
+ }
32
+ interface AnchorLengthResult {
33
+ /** 张力增量,N */
34
+ readonly deltaN: number;
35
+ /** 判据限值 10%·T_N,N */
36
+ readonly limitN: number;
37
+ /** 张力差占额定张力比例 */
38
+ readonly ratio: number;
39
+ /** 是否合格(ΔT ≤ 10%·T_N) */
40
+ readonly passes: boolean;
41
+ }
42
+ /** 锚段张力增量(教材口径)与 10% 判据校核 */
43
+ declare function anchorLengthCheck(input: AnchorLengthInput): AnchorLengthResult;
44
+
45
+ export { type AnchorLengthInput, type AnchorLengthResult, TENSION_DIFF_RATIO, anchorLengthCheck, anchorLengthMeta };
@@ -0,0 +1,11 @@
1
+ import {
2
+ TENSION_DIFF_RATIO,
3
+ anchorLengthCheck,
4
+ anchorLengthMeta
5
+ } from "../chunk-75EGROQB.js";
6
+ export {
7
+ TENSION_DIFF_RATIO,
8
+ anchorLengthCheck,
9
+ anchorLengthMeta
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkHXALVJ4Gcjs = require('../chunk-HXALVJ4G.cjs');
5
+
6
+
7
+
8
+ exports.bValue = _chunkHXALVJ4Gcjs.bValue; exports.bvalueMeta = _chunkHXALVJ4Gcjs.bvalueMeta;
9
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/bvalue/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,6FAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/bvalue/index.cjs"}
@@ -0,0 +1,35 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.cjs';
2
+
3
+ declare const bvalueMeta: CalculatorMeta;
4
+
5
+ /** b 值(坠砣底面距地面高度)计算参数。单位:长度 mm、温度 ℃、张力 kN。 */
6
+ interface BValueInput {
7
+ /** 设计最小 b 值 b_min,mm(最高温度时坠砣最低位) */
8
+ readonly minBMM: number;
9
+ /** 传动比倍数 n(1:3 取 3) */
10
+ readonly ratio: number;
11
+ /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */
12
+ readonly expansionCoeff: number;
13
+ /** 半锚段长度 L,mm */
14
+ readonly halfSpanMM: number;
15
+ /** 最高工作温度 t_max,℃ */
16
+ readonly maxTempC: number;
17
+ /** 安装/检调温度 t_x,℃ */
18
+ readonly targetTempC: number;
19
+ /** 额定张力 T,kN(用于坠砣重量换算) */
20
+ readonly tensionKN?: number;
21
+ }
22
+ interface BValueResult {
23
+ /** 当前温度 b 值 b_x,mm */
24
+ readonly bMM: number;
25
+ /** 温度伸缩量 ΔL = α·L·(t_max − t_x),mm */
26
+ readonly stretchMM: number;
27
+ /** 坠砣侧行程变化 n·ΔL,mm */
28
+ readonly strokeMM: number;
29
+ /** 坠砣总质量(W=T/n,m≈102·W,g 取 9.81 m/s²),kg */
30
+ readonly weightKg: number | null;
31
+ }
32
+ /** b 值计算:b_x = b_min + n·α·L·(t_max − t_x) */
33
+ declare function bValue(params: BValueInput): BValueResult;
34
+
35
+ export { type BValueInput, type BValueResult, bValue, bvalueMeta };
@@ -0,0 +1,35 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.js';
2
+
3
+ declare const bvalueMeta: CalculatorMeta;
4
+
5
+ /** b 值(坠砣底面距地面高度)计算参数。单位:长度 mm、温度 ℃、张力 kN。 */
6
+ interface BValueInput {
7
+ /** 设计最小 b 值 b_min,mm(最高温度时坠砣最低位) */
8
+ readonly minBMM: number;
9
+ /** 传动比倍数 n(1:3 取 3) */
10
+ readonly ratio: number;
11
+ /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */
12
+ readonly expansionCoeff: number;
13
+ /** 半锚段长度 L,mm */
14
+ readonly halfSpanMM: number;
15
+ /** 最高工作温度 t_max,℃ */
16
+ readonly maxTempC: number;
17
+ /** 安装/检调温度 t_x,℃ */
18
+ readonly targetTempC: number;
19
+ /** 额定张力 T,kN(用于坠砣重量换算) */
20
+ readonly tensionKN?: number;
21
+ }
22
+ interface BValueResult {
23
+ /** 当前温度 b 值 b_x,mm */
24
+ readonly bMM: number;
25
+ /** 温度伸缩量 ΔL = α·L·(t_max − t_x),mm */
26
+ readonly stretchMM: number;
27
+ /** 坠砣侧行程变化 n·ΔL,mm */
28
+ readonly strokeMM: number;
29
+ /** 坠砣总质量(W=T/n,m≈102·W,g 取 9.81 m/s²),kg */
30
+ readonly weightKg: number | null;
31
+ }
32
+ /** b 值计算:b_x = b_min + n·α·L·(t_max − t_x) */
33
+ declare function bValue(params: BValueInput): BValueResult;
34
+
35
+ export { type BValueInput, type BValueResult, bValue, bvalueMeta };
@@ -0,0 +1,9 @@
1
+ import {
2
+ bValue,
3
+ bvalueMeta
4
+ } from "../chunk-3GREMF76.js";
5
+ export {
6
+ bValue,
7
+ bvalueMeta
8
+ };
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,11 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+ var _chunkWGTOBRYVcjs = require('../chunk-WGTOBRYV.cjs');
6
+
7
+
8
+
9
+
10
+ exports.ASSEMBLY_TOLERANCE_MM = _chunkWGTOBRYVcjs.ASSEMBLY_TOLERANCE_MM; exports.cantileverCut = _chunkWGTOBRYVcjs.cantileverCut; exports.cantileverMeta = _chunkWGTOBRYVcjs.cantileverMeta;
11
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/cantilever/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACF,4LAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/cantilever/index.cjs"}
@@ -0,0 +1,31 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.cjs';
2
+
3
+ declare const cantileverMeta: CalculatorMeta;
4
+
5
+ /** 腕臂预配安装偏差(TB 10758-2018 第 5.10.1 条),mm */
6
+ declare const ASSEMBLY_TOLERANCE_MM = 5;
7
+ /** 斜腕臂勾股下料计算输入。单位:m。 */
8
+ interface CantileverInput {
9
+ /** 上下底座竖直距 h,m */
10
+ readonly verticalOffsetM: number;
11
+ /** 下底座至定位点水平投影 d,m */
12
+ readonly horizontalProjectionM: number;
13
+ /** 端部零件扣减 Δc,m */
14
+ readonly endDeductionM?: number;
15
+ /** 定位点至下底座竖直距 y_d,m */
16
+ readonly regHeightM?: number;
17
+ }
18
+ interface CantileverResult {
19
+ /** 理论斜长 √(h²+d²),m */
20
+ readonly fullLengthM: number;
21
+ /** 下料长度 L = √(h²+d²) − Δc,m */
22
+ readonly cutLengthM: number;
23
+ /** 定位环安装位置 s = (y_d/h)·√(h²+d²),m */
24
+ readonly regulatorPosM: number | null;
25
+ /** 安装允差,mm */
26
+ readonly toleranceMM: number;
27
+ }
28
+ /** 斜腕臂勾股下料(几何自证) */
29
+ declare function cantileverCut(input: CantileverInput): CantileverResult;
30
+
31
+ export { ASSEMBLY_TOLERANCE_MM, type CantileverInput, type CantileverResult, cantileverCut, cantileverMeta };
@@ -0,0 +1,31 @@
1
+ import { C as CalculatorMeta } from '../types-C2OanO8N.js';
2
+
3
+ declare const cantileverMeta: CalculatorMeta;
4
+
5
+ /** 腕臂预配安装偏差(TB 10758-2018 第 5.10.1 条),mm */
6
+ declare const ASSEMBLY_TOLERANCE_MM = 5;
7
+ /** 斜腕臂勾股下料计算输入。单位:m。 */
8
+ interface CantileverInput {
9
+ /** 上下底座竖直距 h,m */
10
+ readonly verticalOffsetM: number;
11
+ /** 下底座至定位点水平投影 d,m */
12
+ readonly horizontalProjectionM: number;
13
+ /** 端部零件扣减 Δc,m */
14
+ readonly endDeductionM?: number;
15
+ /** 定位点至下底座竖直距 y_d,m */
16
+ readonly regHeightM?: number;
17
+ }
18
+ interface CantileverResult {
19
+ /** 理论斜长 √(h²+d²),m */
20
+ readonly fullLengthM: number;
21
+ /** 下料长度 L = √(h²+d²) − Δc,m */
22
+ readonly cutLengthM: number;
23
+ /** 定位环安装位置 s = (y_d/h)·√(h²+d²),m */
24
+ readonly regulatorPosM: number | null;
25
+ /** 安装允差,mm */
26
+ readonly toleranceMM: number;
27
+ }
28
+ /** 斜腕臂勾股下料(几何自证) */
29
+ declare function cantileverCut(input: CantileverInput): CantileverResult;
30
+
31
+ export { ASSEMBLY_TOLERANCE_MM, type CantileverInput, type CantileverResult, cantileverCut, cantileverMeta };
@@ -0,0 +1,11 @@
1
+ import {
2
+ ASSEMBLY_TOLERANCE_MM,
3
+ cantileverCut,
4
+ cantileverMeta
5
+ } from "../chunk-HZWNKKIB.js";
6
+ export {
7
+ ASSEMBLY_TOLERANCE_MM,
8
+ cantileverCut,
9
+ cantileverMeta
10
+ };
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,44 @@
1
+ // src/bvalue/meta.ts
2
+ var bvalueMeta = {
3
+ name: "b\u503C\uFF08\u5760\u7823\u9AD8\u5EA6\uFF09\u5B89\u88C5\u66F2\u7EBF",
4
+ nameEn: "B-Value (Balance Weight) Installation Curve",
5
+ summary: "\u6309 b_x = b_min + n\xB7\u03B1\xB7L\xB7(t_max \u2212 t_x) \u8BA1\u7B97\u4EFB\u4E00\u6E29\u5EA6\u4E0B\u5760\u7823\u5E95\u9762\u8DDD\u5730\u9762\u9AD8\u5EA6\uFF0C\u7528\u4E8E\u5760\u7823\u5B89\u88C5\u4E0E\u68C0\u8C03\u5B9A\u4F4D\u3002",
6
+ formula: [
7
+ "b_x = b_min + n\xB7\u03B1\xB7L\xB7(t_max \u2212 t_x)",
8
+ "\u5760\u7823\u4FA7\u884C\u7A0B\u53D8\u5316 n\xB7\u0394L\uFF0C\u0394L = \u03B1\xB7L\xB7(t_max \u2212 t_x)",
9
+ "\u5760\u7823\u4FA7\u5F20\u529B W = T/n\uFF0C\u5BF9\u5E94\u5760\u7823\u603B\u8D28\u91CF m \u2248 102\xB7W kg"
10
+ ],
11
+ references: [
12
+ "\u9650\u503C\u53E3\u5F84\uFF1A\u8FD0\u884C \u2265200 mm\u3001\u504F\u5DEE \xB1100 mm\uFF08TB 10421-2018 \u7B2C 5.22.3 \u6761\uFF09",
13
+ "\u8BBE\u8BA1 \u2265300 mm\uFF08\u671F\u520A\u5F15\u94C1\u8FD0\u30142007\u301569 \u53F7\uFF09",
14
+ "\u4F20\u52A8\u6BD4\u500D\u6570 n\uFF1A1:3 \u5373 n=3"
15
+ ],
16
+ scope: ["b_min\uFF1A50~1000 mm", "\u534A\u951A\u6BB5 L\uFF1A50000~900000 mm", "\u6E29\u5EA6\u5DEE\uFF1A0~100 \u2103", "\u4F20\u52A8\u6BD4\uFF1A2~4"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/bvalue/"
19
+ };
20
+
21
+ // src/bvalue/index.ts
22
+ function bValue(params) {
23
+ const { minBMM, ratio, expansionCoeff, halfSpanMM, maxTempC, targetTempC, tensionKN } = params;
24
+ if (!(minBMM >= 0)) throw new RangeError("b_min \u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 " + minBMM);
25
+ if (!(ratio > 0)) throw new RangeError("\u4F20\u52A8\u6BD4\u500D\u6570\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + ratio);
26
+ if (!(halfSpanMM > 0)) throw new RangeError("\u534A\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + halfSpanMM);
27
+ const dt = maxTempC - targetTempC;
28
+ const stretchMM = expansionCoeff * halfSpanMM * dt;
29
+ const strokeMM = ratio * stretchMM;
30
+ const bMM = minBMM + strokeMM;
31
+ let weightKg = null;
32
+ if (tensionKN !== void 0) {
33
+ if (!(tensionKN > 0)) throw new RangeError("\u989D\u5B9A\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + tensionKN);
34
+ const WKN = tensionKN / ratio;
35
+ weightKg = WKN * 102;
36
+ }
37
+ return { bMM, stretchMM, strokeMM, weightKg };
38
+ }
39
+
40
+ export {
41
+ bvalueMeta,
42
+ bValue
43
+ };
44
+ //# sourceMappingURL=chunk-3GREMF76.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bvalue/meta.ts","../src/bvalue/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const bvalueMeta: CalculatorMeta = {\n name: 'b值(坠砣高度)安装曲线',\n nameEn: 'B-Value (Balance Weight) Installation Curve',\n summary: '按 b_x = b_min + n·α·L·(t_max − t_x) 计算任一温度下坠砣底面距地面高度,用于坠砣安装与检调定位。',\n formula: [\n 'b_x = b_min + n·α·L·(t_max − t_x)',\n '坠砣侧行程变化 n·ΔL,ΔL = α·L·(t_max − t_x)',\n '坠砣侧张力 W = T/n,对应坠砣总质量 m ≈ 102·W kg',\n ],\n references: [\n '限值口径:运行 ≥200 mm、偏差 ±100 mm(TB 10421-2018 第 5.22.3 条)',\n '设计 ≥300 mm(期刊引铁运〔2007〕69 号)',\n '传动比倍数 n:1:3 即 n=3',\n ],\n scope: ['b_min:50~1000 mm', '半锚段 L:50000~900000 mm', '温度差:0~100 ℃', '传动比:2~4'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/bvalue/',\n};\n","export { bvalueMeta } from './meta';\n\n/** b 值(坠砣底面距地面高度)计算参数。单位:长度 mm、温度 ℃、张力 kN。 */\nexport interface BValueInput {\n /** 设计最小 b 值 b_min,mm(最高温度时坠砣最低位) */\n readonly minBMM: number;\n /** 传动比倍数 n(1:3 取 3) */\n readonly ratio: number;\n /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */\n readonly expansionCoeff: number;\n /** 半锚段长度 L,mm */\n readonly halfSpanMM: number;\n /** 最高工作温度 t_max,℃ */\n readonly maxTempC: number;\n /** 安装/检调温度 t_x,℃ */\n readonly targetTempC: number;\n /** 额定张力 T,kN(用于坠砣重量换算) */\n readonly tensionKN?: number;\n}\n\nexport interface BValueResult {\n /** 当前温度 b 值 b_x,mm */\n readonly bMM: number;\n /** 温度伸缩量 ΔL = α·L·(t_max − t_x),mm */\n readonly stretchMM: number;\n /** 坠砣侧行程变化 n·ΔL,mm */\n readonly strokeMM: number;\n /** 坠砣总质量(W=T/n,m≈102·W,g 取 9.81 m/s²),kg */\n readonly weightKg: number | null;\n}\n\n/** b 值计算:b_x = b_min + n·α·L·(t_max − t_x) */\nexport function bValue(params: BValueInput): BValueResult {\n const { minBMM, ratio, expansionCoeff, halfSpanMM, maxTempC, targetTempC, tensionKN } = params;\n if (!(minBMM >= 0)) throw new RangeError('b_min 不能为负,收到 ' + minBMM);\n if (!(ratio > 0)) throw new RangeError('传动比倍数必须为正,收到 ' + ratio);\n if (!(halfSpanMM > 0)) throw new RangeError('半锚段长度必须为正,收到 ' + halfSpanMM);\n const dt = maxTempC - targetTempC;\n const stretchMM = expansionCoeff * halfSpanMM * dt;\n const strokeMM = ratio * stretchMM;\n const bMM = minBMM + strokeMM;\n let weightKg: number | null = null;\n if (tensionKN !== undefined) {\n if (!(tensionKN > 0)) throw new RangeError('额定张力必须为正,收到 ' + tensionKN);\n const WKN = tensionKN / ratio;\n weightKg = WKN * 102; // 1 kN ≈ 102 kg(g=9.81)\n }\n return { bMM, stretchMM, strokeMM, weightKg };\n}\n"],"mappings":";AAEO,IAAM,aAA6B;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO,CAAC,yBAAoB,6CAAyB,wCAAe,6BAAS;AAAA,EAC7E,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACaO,SAAS,OAAO,QAAmC;AACxD,QAAM,EAAE,QAAQ,OAAO,gBAAgB,YAAY,UAAU,aAAa,UAAU,IAAI;AACxF,MAAI,EAAE,UAAU,GAAI,OAAM,IAAI,WAAW,sDAAmB,MAAM;AAClE,MAAI,EAAE,QAAQ,GAAI,OAAM,IAAI,WAAW,8EAAkB,KAAK;AAC9D,MAAI,EAAE,aAAa,GAAI,OAAM,IAAI,WAAW,8EAAkB,UAAU;AACxE,QAAM,KAAK,WAAW;AACtB,QAAM,YAAY,iBAAiB,aAAa;AAChD,QAAM,WAAW,QAAQ;AACzB,QAAM,MAAM,SAAS;AACrB,MAAI,WAA0B;AAC9B,MAAI,cAAc,QAAW;AAC3B,QAAI,EAAE,YAAY,GAAI,OAAM,IAAI,WAAW,wEAAiB,SAAS;AACrE,UAAM,MAAM,YAAY;AACxB,eAAW,MAAM;AAAA,EACnB;AACA,SAAO,EAAE,KAAK,WAAW,UAAU,SAAS;AAC9C;","names":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/pole-capacity/meta.ts
2
+ var poleCapacityMeta = {
3
+ name: "\u652F\u67F1\u5BB9\u91CF\u9009\u578B\u6821\u6838",
4
+ nameEn: "Mast Capacity Selection Check",
5
+ summary: "\u5BB9\u91CF\u6BD4\u8F83\u6CD5\uFF1A\u60AC\u6302\u6C34\u5E73\u529B\u4E0E\u652F\u67F1\u98CE\u8F7D\u5408\u6210\u5DE5\u4F5C\u5F2F\u77E9\uFF0C\u5BF9\u7167 GB/T 25020.1 \u94A2\u652F\u67F1\u68C0\u9A8C\u5F2F\u77E9\u7CFB\u5217\u9009\u578B\u3002",
6
+ formula: [
7
+ "\u76F4\u7EBF\u4E4B\u5B57\u529B F_z = 4(T_j+T_c)\xB7a/l\uFF1B\u66F2\u7EBF\u529B F_q = (T_j+T_c)\xB7l/R",
8
+ "\u5DE5\u4F5C\u5F2F\u77E9 M = F_h\xB7h_e + P\xB7b\xB7h\xB2/2 + F_wl\xB7h_e",
9
+ "\u627F\u8F7D\u529B\u68C0\u9A8C\u5F2F\u77E9 = 1.5 \xD7 \u6807\u79F0\u5BB9\u91CF\uFF0825020.1 \u8868 A.2 \u8868\u503C\u89C4\u5F8B\uFF09"
10
+ ],
11
+ references: [
12
+ "\u94A2\u67F1\u76F4\u63A5\u4F9D\u636E\uFF1AGB/T 25020.1-2025 \u7B2C 5.1.1 \u6761 + \u9644\u5F55 A \u68C0\u9A8C\u5F2F\u77E9\u7CFB\u5217",
13
+ "\u540C\u53E3\u5F84\u6DF7\u51DD\u571F\u67F1\u6761\u6B3E\uFF1ATB/T 2286-2020 \u7B2C 5.9.2 \u6761\uFF08\u8377\u8F7D\u77E2\u91CF\u7EC4\u5408\u4E0D\u5927\u4E8E\u68C0\u9A8C\u5F2F\u77E9\uFF09",
14
+ "\u5206\u9879\u7CFB\u6570\u6781\u9650\u72B6\u6001\u6CD5\uFF08GB/T 32578-2016 6.3.3 \u8868 15\uFF09\u4E3A\u8BBE\u8BA1\u6B63\u5F0F\u53E3\u5F84\uFF0C\u4E0D\u53EF\u6DF7\u7528"
15
+ ],
16
+ scope: ["\u5F20\u529B\uFF1A5~45 kN", "\u8DE8\u8DDD\uFF1A30~90 m", "\u98CE\u538B\uFF1A100~1500 Pa", "\u652F\u67F1\u9AD8\uFF1A5~20 m"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/pole-capacity/"
19
+ };
20
+
21
+ // src/pole-capacity/index.ts
22
+ var STEEL_POLE_SERIES_KNM = [150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 750, 900, 1050, 1200, 1500];
23
+ var TEST_MOMENT_FACTOR = 1.5;
24
+ function poleCapacityCheck(input) {
25
+ const { section, contactWireTensionKN, messengerTensionKN, staggerMM, spanM, resultantHeightM, windPressurePa, poleWidthM, poleHeightM, wireWindLoadN } = input;
26
+ if (!(contactWireTensionKN >= 0) || !(messengerTensionKN >= 0)) throw new RangeError("\u5F20\u529B\u4E0D\u80FD\u4E3A\u8D1F");
27
+ const T = contactWireTensionKN + messengerTensionKN;
28
+ const a = staggerMM / 1e3;
29
+ const Fz = 4 * T * a / spanM;
30
+ let Fh;
31
+ if (section === "curve") {
32
+ if (!(input.curveRadiusM && input.curveRadiusM > 0)) throw new RangeError("\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63");
33
+ const Fq = T * spanM / input.curveRadiusM;
34
+ Fh = Math.abs(Fq - Fz);
35
+ } else {
36
+ Fh = Fz;
37
+ }
38
+ const M1 = Fh * resultantHeightM;
39
+ const M2 = windPressurePa * poleWidthM * Math.pow(poleHeightM, 2) / 2 / 1e3;
40
+ const M3 = (_nullishCoalesce(wireWindLoadN, () => ( 0))) * resultantHeightM / 1e3;
41
+ const M = M1 + M2 + M3;
42
+ const nomNeed = M / TEST_MOMENT_FACTOR;
43
+ const pick = _nullishCoalesce(STEEL_POLE_SERIES_KNM.find((n) => n >= nomNeed), () => ( null));
44
+ return {
45
+ horizontalForceN: Fh * 1e3,
46
+ workMomentKNM: M,
47
+ nominalNeedKNM: nomNeed,
48
+ selection: pick ? "G" + pick : null
49
+ };
50
+ }
51
+
52
+
53
+
54
+
55
+
56
+
57
+ exports.poleCapacityMeta = poleCapacityMeta; exports.STEEL_POLE_SERIES_KNM = STEEL_POLE_SERIES_KNM; exports.TEST_MOMENT_FACTOR = TEST_MOMENT_FACTOR; exports.poleCapacityCheck = poleCapacityCheck;
58
+ //# sourceMappingURL=chunk-4344WWAF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-4344WWAF.cjs","../src/pole-capacity/meta.ts","../src/pole-capacity/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-4344WWAF.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const poleCapacityMeta: CalculatorMeta = {\n name: '支柱容量选型校核',\n nameEn: 'Mast Capacity Selection Check',\n summary: '容量比较法:悬挂水平力与支柱风载合成工作弯矩,对照 GB/T 25020.1 钢支柱检验弯矩系列选型。',\n formula: [\n '直线之字力 F_z = 4(T_j+T_c)·a/l;曲线力 F_q = (T_j+T_c)·l/R',\n '工作弯矩 M = F_h·h_e + P·b·h²/2 + F_wl·h_e',\n '承载力检验弯矩 = 1.5 × 标称容量(25020.1 表 A.2 表值规律)',\n ],\n references: [\n '钢柱直接依据:GB/T 25020.1-2025 第 5.1.1 条 + 附录 A 检验弯矩系列',\n '同口径混凝土柱条款:TB/T 2286-2020 第 5.9.2 条(荷载矢量组合不大于检验弯矩)',\n '分项系数极限状态法(GB/T 32578-2016 6.3.3 表 15)为设计正式口径,不可混用',\n ],\n scope: ['张力:5~45 kN', '跨距:30~90 m', '风压:100~1500 Pa', '支柱高:5~20 m'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/pole-capacity/',\n};\n","export { poleCapacityMeta } from './meta';\n\n/** GB/T 25020.1-2025 格构式钢支柱标称容量系列(表 A.2),kN·m */\nexport const STEEL_POLE_SERIES_KNM = [150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 750, 900, 1050, 1200, 1500] as const;\n\n/** 承载力检验弯矩 = 1.5 × 标称容量(25020.1 表 A.2 表值规律) */\nexport const TEST_MOMENT_FACTOR = 1.5;\n\n/** 支柱容量校核输入。单位:kN、m、mm、Pa。 */\nexport interface PoleCapacityInput {\n /** 区段类型 */\n readonly section: 'line' | 'curve';\n /** 接触线张力 T_j,kN */\n readonly contactWireTensionKN: number;\n /** 承力索张力 T_c,kN */\n readonly messengerTensionKN: number;\n /** 拉出值 a,mm */\n readonly staggerMM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 曲线半径 R,m(曲线区段) */\n readonly curveRadiusM?: number;\n /** 水平力合力作用高度 h_e,m */\n readonly resultantHeightM: number;\n /** 设计最大风压 P,Pa */\n readonly windPressurePa: number;\n /** 支柱迎风宽度 b,m */\n readonly poleWidthM: number;\n /** 支柱高度 h,m */\n readonly poleHeightM: number;\n /** 线索风载 F_wl,N */\n readonly wireWindLoadN?: number;\n}\n\nexport interface PoleCapacityResult {\n /** 悬挂水平力 F_h,N */\n readonly horizontalForceN: number;\n /** 工作弯矩 M,kN·m */\n readonly workMomentKNM: number;\n /** 折合标称容量(÷1.5),kN·m */\n readonly nominalNeedKNM: number;\n /** 选型结果 */\n readonly selection: string | null;\n}\n\n/** 支柱容量选型(容量比较法,TB/T 2286 5.9.2 检验弯矩口径;钢柱 25020.1 5.1.1+附录A) */\nexport function poleCapacityCheck(input: PoleCapacityInput): PoleCapacityResult {\n const { section, contactWireTensionKN, messengerTensionKN, staggerMM, spanM, resultantHeightM, windPressurePa, poleWidthM, poleHeightM, wireWindLoadN } = input;\n if (!(contactWireTensionKN >= 0) || !(messengerTensionKN >= 0)) throw new RangeError('张力不能为负');\n const T = contactWireTensionKN + messengerTensionKN;\n const a = staggerMM / 1e3;\n const Fz = (4 * T * a) / spanM; // kN\n let Fh: number;\n if (section === 'curve') {\n if (!(input.curveRadiusM && input.curveRadiusM > 0)) throw new RangeError('曲线半径必须为正');\n const Fq = (T * spanM) / input.curveRadiusM;\n Fh = Math.abs(Fq - Fz);\n } else {\n Fh = Fz;\n }\n const M1 = Fh * resultantHeightM; // 悬挂水平力矩 kN·m\n const M2 = (windPressurePa * poleWidthM * Math.pow(poleHeightM, 2) / 2) / 1e3; // 支柱风载矩\n const M3 = ((wireWindLoadN ?? 0) * resultantHeightM) / 1e3;\n const M = M1 + M2 + M3;\n const nomNeed = M / TEST_MOMENT_FACTOR;\n const pick = STEEL_POLE_SERIES_KNM.find((n) => n >= nomNeed) ?? null;\n return {\n horizontalForceN: Fh * 1e3,\n workMomentKNM: M,\n nominalNeedKNM: nomNeed,\n selection: pick ? 'G' + pick : null,\n };\n}\n"]}
@@ -0,0 +1,116 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/steady-arm/meta.ts
2
+ var steadyArmMeta = {
3
+ name: "\u5B9A\u4F4D\u5668\u5761\u5EA6\u6821\u6838",
4
+ nameEn: "Steady Arm Slope Check",
5
+ summary: "\u8BA1\u7B97\u5B9A\u4F4D\u5668\u6240\u53D7\u6C34\u5E73\u529B\uFF08\u76F4\u7EBF\u4E4B\u5B57\u529B / \u66F2\u7EBF\u529B\uFF09\u4E0E\u5782\u76F4\u529B\uFF0C\u6C42\u5761\u5EA6\u89D2\u4E0E\u5761\u5EA6\u6BD4\uFF0C\u5E76\u6309\u76F4\u7EBF/\u66F2\u7EBF\u9650\u503C\u5224\u5B9A\u662F\u5426\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42\u3002",
6
+ formula: [
7
+ "\u76F4\u7EBF\u4E4B\u5B57\u529B\uFF1AFz = 4\xB7T\xB7a/l\uFF08a \u4E3A\u62C9\u51FA\u503C\uFF0Cmm \u6362\u7B97 m\uFF09",
8
+ "\u66F2\u7EBF\u529B\uFF1AFq = T\xB7l/R",
9
+ "\u66F2\u7EBF\u5408\u6210\uFF1AFs = |Fq \u2212 Fz|\uFF1B\u76F4\u7EBF\u533A\u6BB5 Fs = Fz",
10
+ "\u5782\u76F4\u529B\uFF1AFc = g_j\xB7l\u2081 + G_d",
11
+ "\u5761\u5EA6\u89D2\uFF1A\u03B8 = atan(Fc/Fs)\uFF0C\u5F27\u5EA6\u8F6C\u5EA6",
12
+ "\u5761\u5EA6\u6BD4\uFF08\u5782\u76F4\u2236\u6C34\u5E73\uFF09= 1\u2236n\uFF0Cn = Fs/Fc",
13
+ "\u9650\u503C\uFF08\u76F4\u7EBF \u03B8 \u2265 8\xB0\uFF1B\u66F2\u7EBF 6\xB0 \u2264 \u03B8 \u2264 16\xB0\uFF09"
14
+ ],
15
+ references: [
16
+ "\u6559\u6750\u901A\u884C\u8FD1\u4F3C\uFF1A\u4E4B\u5B57\u529B Fz = 4\xB7T\xB7a/l\u3001\u66F2\u7EBF\u529B Fq = T\xB7l/R",
17
+ "\u7F57\u5065\u7B49\u300A\u9AD8\u901F\u94C1\u8DEF\u63A5\u89E6\u7F51\u5B9A\u4F4D\u5668\u5761\u5EA6\u95EE\u9898\u7684\u6DF1\u5316\u7814\u7A76\u300B\uFF0C\u94C1\u9053\u5DE5\u7A0B\u5B66\u62A5 2013, 30(1): 76-80\uFF08300 km/h \u53CA\u4EE5\u4E0A\u5761\u5EA6\u9650\u503C\u53E3\u5F84\uFF09",
18
+ "\u5728\u7EBF\u53C2\u8003\uFF1Ahttps://www.itswe.com/calculator/steady-arm/"
19
+ ],
20
+ scope: [
21
+ "\u63A5\u89E6\u7EBF\u5F20\u529B T\uFF1A1 ~ 40 kN",
22
+ "\u62C9\u51FA\u503C a\uFF1A50 ~ 500 mm",
23
+ "\u8DE8\u8DDD l\uFF1A5 ~ 80 m",
24
+ "\u66F2\u7EBF\u534A\u5F84 R\uFF1A500 ~ 12000 m\uFF08undefined \u8868\u793A\u76F4\u7EBF\uFF09",
25
+ "\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD g_j\uFF1A0.001 ~ 0.1 kN/m",
26
+ "\u5B9A\u4F4D\u5668\u81EA\u91CD G_d\uFF1A0 ~ 0.5 kN",
27
+ "\u9650\u503C\u9002\u7528\u4E8E 300 km/h \u53CA\u4EE5\u4E0A\u9AD8\u94C1\uFF1B\u4E2D\u4F4E\u901F\u7EBF\u8DEF\u5761\u5EA6\u9650\u503C\u53EF\u4E0D\u540C",
28
+ "\u672A\u8BA1\u5165\u98CE\u8377\u8F7D\u3001\u5B9A\u4F4D\u5668\u957F\u5EA6\u65B9\u5411\u503E\u659C\u4E0E\u96F6\u90E8\u4EF6\u516C\u5DEE"
29
+ ],
30
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
31
+ online: "https://www.itswe.com/calculator/steady-arm/"
32
+ };
33
+
34
+ // src/steady-arm/index.ts
35
+ function steadyArmAngleDeg(input) {
36
+ const {
37
+ contactWireTensionKN: T,
38
+ staggerMM,
39
+ spanM: l,
40
+ curveRadiusM,
41
+ firstDropperOffsetM: l1,
42
+ wireWeightKNPerM: gJ,
43
+ regulatorSelfWeightKN: gD
44
+ } = input;
45
+ if (!(T > 0)) {
46
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${T} kN`);
47
+ }
48
+ if (!(staggerMM > 0)) {
49
+ throw new RangeError(`\u62C9\u51FA\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${staggerMM} mm`);
50
+ }
51
+ if (!(l > 0)) {
52
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${l} m`);
53
+ }
54
+ if (curveRadiusM !== void 0 && !(curveRadiusM > 0)) {
55
+ throw new RangeError(`\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${curveRadiusM} m`);
56
+ }
57
+ if (!(l1 >= 0)) {
58
+ throw new RangeError(`\u7B2C\u4E00\u540A\u5F26\u8DDD\u5B9A\u4F4D\u70B9\u8DDD\u79BB\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${l1} m`);
59
+ }
60
+ if (!(gJ >= 0)) {
61
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${gJ} kN/m`);
62
+ }
63
+ if (!(gD >= 0)) {
64
+ throw new RangeError(`\u5B9A\u4F4D\u5668\u81EA\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${gD} kN`);
65
+ }
66
+ const isStraight = curveRadiusM === void 0;
67
+ const aM = staggerMM * 1e-3;
68
+ const fz = 4 * T * aM / l;
69
+ let fq = 0;
70
+ let fs = fz;
71
+ if (!isStraight) {
72
+ const R = curveRadiusM;
73
+ fq = T * l / R;
74
+ fs = Math.abs(fq - fz);
75
+ }
76
+ const fc = gJ * l1 + gD;
77
+ if (!(fs > 0)) {
78
+ throw new RangeError(
79
+ `\u6C34\u5E73\u5408\u6210\u529B Fs = ${fs} kN \u987B\u4E3A\u6B63\u6570\uFF08\u66F2\u7EBF\u529B\u4E0E\u4E4B\u5B57\u529B\u76F8\u7B49\u65F6\u5761\u5EA6\u65E0\u610F\u4E49\uFF09\uFF0C\u8BF7\u590D\u6838\u8F93\u5165`
80
+ );
81
+ }
82
+ if (!(fc > 0)) {
83
+ throw new RangeError(
84
+ `\u5782\u76F4\u529B Fc = ${fc} kN \u987B\u4E3A\u6B63\u6570\uFF0C\u8BF7\u590D\u6838\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD / \u5B9A\u4F4D\u5668\u81EA\u91CD`
85
+ );
86
+ }
87
+ const angleDeg = Math.atan(fc / fs) * 180 / Math.PI;
88
+ const slopeRatio = fs / fc;
89
+ return {
90
+ staggerForceKN: fz,
91
+ curveForceKN: fq,
92
+ horizontalForceKN: fs,
93
+ verticalForceKN: fc,
94
+ angleDeg,
95
+ slopeRatio,
96
+ isStraight
97
+ };
98
+ }
99
+ function steadyArmCheck(input) {
100
+ const base = steadyArmAngleDeg(input);
101
+ if (base.isStraight) {
102
+ const passes2 = base.angleDeg >= 8;
103
+ const reason2 = passes2 ? `\u76F4\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u2265 8\xB0\uFF0C\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42` : `\u76F4\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 < 8\xB0\uFF0C\u4E0D\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42\uFF08\u9700 \u2265 8\xB0\uFF09`;
104
+ return { ...base, passes: passes2, reason: reason2 };
105
+ }
106
+ const passes = base.angleDeg >= 6 && base.angleDeg <= 16;
107
+ const reason = passes ? `\u66F2\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u4F4D\u4E8E 6\xB0 ~ 16\xB0 \u533A\u95F4\uFF0C\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42` : `\u66F2\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u8D85\u51FA 6\xB0 ~ 16\xB0 \u533A\u95F4\uFF0C\u4E0D\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42`;
108
+ return { ...base, passes, reason };
109
+ }
110
+
111
+
112
+
113
+
114
+
115
+ exports.steadyArmMeta = steadyArmMeta; exports.steadyArmAngleDeg = steadyArmAngleDeg; exports.steadyArmCheck = steadyArmCheck;
116
+ //# sourceMappingURL=chunk-57J7I6JA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-57J7I6JA.cjs","../src/steady-arm/meta.ts","../src/steady-arm/index.ts"],"names":["passes","reason"],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-57J7I6JA.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const steadyArmMeta: CalculatorMeta = {\n name: '定位器坡度校核',\n nameEn: 'Steady Arm Slope Check',\n summary:\n '计算定位器所受水平力(直线之字力 / 曲线力)与垂直力,求坡度角与坡度比,并按直线/曲线限值判定是否满足坡度要求。',\n formula: [\n '直线之字力:Fz = 4·T·a/l(a 为拉出值,mm 换算 m)',\n '曲线力:Fq = T·l/R',\n '曲线合成:Fs = |Fq − Fz|;直线区段 Fs = Fz',\n '垂直力:Fc = g_j·l₁ + G_d',\n '坡度角:θ = atan(Fc/Fs),弧度转度',\n '坡度比(垂直∶水平)= 1∶n,n = Fs/Fc',\n '限值(直线 θ ≥ 8°;曲线 6° ≤ θ ≤ 16°)',\n ],\n references: [\n '教材通行近似:之字力 Fz = 4·T·a/l、曲线力 Fq = T·l/R',\n '罗健等《高速铁路接触网定位器坡度问题的深化研究》,铁道工程学报 2013, 30(1): 76-80(300 km/h 及以上坡度限值口径)',\n '在线参考:https://www.itswe.com/calculator/steady-arm/',\n ],\n scope: [\n '接触线张力 T:1 ~ 40 kN',\n '拉出值 a:50 ~ 500 mm',\n '跨距 l:5 ~ 80 m',\n '曲线半径 R:500 ~ 12000 m(undefined 表示直线)',\n '接触线单位重 g_j:0.001 ~ 0.1 kN/m',\n '定位器自重 G_d:0 ~ 0.5 kN',\n '限值适用于 300 km/h 及以上高铁;中低速线路坡度限值可不同',\n '未计入风荷载、定位器长度方向倾斜与零部件公差',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/steady-arm/',\n};\n","export { steadyArmMeta } from './meta';\n\n/** 定位器坡度校核的输入参数 */\nexport interface SteadyArmInput {\n /** 接触线张力 T,kN */\n readonly contactWireTensionKN: number;\n /** 拉出值 a,mm(内部换算 m) */\n readonly staggerMM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 曲线半径 R,m。undefined 表示直线区段 */\n readonly curveRadiusM?: number;\n /** 第一吊弦距定位点距离 l₁,m */\n readonly firstDropperOffsetM: number;\n /** 接触线单位重 g_j,kN/m */\n readonly wireWeightKNPerM: number;\n /** 定位器自重 G_d,kN */\n readonly regulatorSelfWeightKN: number;\n}\n\n/** 定位器受力与坡度角计算结果 */\nexport interface SteadyArmAngleResult {\n /** 直线之字力 Fz,kN */\n readonly staggerForceKN: number;\n /** 曲线力 Fq,kN(直线区段为 0) */\n readonly curveForceKN: number;\n /** 水平合成力 Fs,kN(直线为 Fz;曲线为 |Fq − Fz|) */\n readonly horizontalForceKN: number;\n /** 垂直力 Fc,kN */\n readonly verticalForceKN: number;\n /** 坡度角 θ = atan(Fc/Fs),度 */\n readonly angleDeg: number;\n /** 坡度比(垂直∶水平)= 1∶n,n = Fs/Fc */\n readonly slopeRatio: number;\n /** 是否为直线区段 */\n readonly isStraight: boolean;\n}\n\n/** 定位器坡度校核结果 */\nexport interface SteadyArmCheckResult extends SteadyArmAngleResult {\n /** 是否满足限值要求 */\n readonly passes: boolean;\n /** 判定理由 */\n readonly reason: string;\n}\n\n/**\n * 定位器坡度计算(纯函数):\n * Fz = 4·T·a/l (直线之字力,a 由 mm 换算 m)\n * Fq = T·l/R (曲线力)\n * Fs = |Fq − Fz| (曲线合成,直线时 Fs = Fz)\n * Fc = g_j·l₁ + G_d (垂直力)\n * θ = atan(Fc/Fs) (坡度角,弧度转度)\n * n = Fs/Fc (坡度比 1∶n)\n */\nexport function steadyArmAngleDeg(input: SteadyArmInput): SteadyArmAngleResult {\n const {\n contactWireTensionKN: T,\n staggerMM,\n spanM: l,\n curveRadiusM,\n firstDropperOffsetM: l1,\n wireWeightKNPerM: gJ,\n regulatorSelfWeightKN: gD,\n } = input;\n\n if (!(T > 0)) {\n throw new RangeError(`接触线张力必须为正数,收到 ${T} kN`);\n }\n if (!(staggerMM > 0)) {\n throw new RangeError(`拉出值必须为正数,收到 ${staggerMM} mm`);\n }\n if (!(l > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${l} m`);\n }\n if (curveRadiusM !== undefined && !(curveRadiusM > 0)) {\n throw new RangeError(`曲线半径必须为正数,收到 ${curveRadiusM} m`);\n }\n if (!(l1 >= 0)) {\n throw new RangeError(`第一吊弦距定位点距离不能为负,收到 ${l1} m`);\n }\n if (!(gJ >= 0)) {\n throw new RangeError(`接触线单位重不能为负,收到 ${gJ} kN/m`);\n }\n if (!(gD >= 0)) {\n throw new RangeError(`定位器自重不能为负,收到 ${gD} kN`);\n }\n\n const isStraight = curveRadiusM === undefined;\n\n const aM = staggerMM * 1e-3;\n const fz = (4 * T * aM) / l;\n\n let fq = 0;\n let fs = fz;\n if (!isStraight) {\n const R = curveRadiusM as number;\n fq = (T * l) / R;\n fs = Math.abs(fq - fz);\n }\n\n const fc = gJ * l1 + gD;\n\n if (!(fs > 0)) {\n throw new RangeError(\n `水平合成力 Fs = ${fs} kN 须为正数(曲线力与之字力相等时坡度无意义),请复核输入`,\n );\n }\n if (!(fc > 0)) {\n throw new RangeError(\n `垂直力 Fc = ${fc} kN 须为正数,请复核接触线单位重 / 定位器自重`,\n );\n }\n\n const angleDeg = (Math.atan(fc / fs) * 180) / Math.PI;\n const slopeRatio = fs / fc;\n\n return {\n staggerForceKN: fz,\n curveForceKN: fq,\n horizontalForceKN: fs,\n verticalForceKN: fc,\n angleDeg,\n slopeRatio,\n isStraight,\n };\n}\n\n/**\n * 定位器坡度限值校核。\n *\n * 限值(300 km/h 及以上高铁期刊口径,罗健等《高速铁路接触网定位器坡度问题的深化研究》,\n * 铁道工程学报 2013,30(1):76-80):\n * - 直线区段:θ ≥ 8°\n * - 曲线区段:6° ≤ θ ≤ 16°\n */\nexport function steadyArmCheck(input: SteadyArmInput): SteadyArmCheckResult {\n const base = steadyArmAngleDeg(input);\n\n if (base.isStraight) {\n const passes = base.angleDeg >= 8;\n const reason = passes\n ? `直线区段:θ = ${base.angleDeg.toFixed(4)}° ≥ 8°,满足坡度要求`\n : `直线区段:θ = ${base.angleDeg.toFixed(4)}° < 8°,不满足坡度要求(需 ≥ 8°)`;\n return { ...base, passes, reason };\n }\n\n const passes = base.angleDeg >= 6 && base.angleDeg <= 16;\n const reason = passes\n ? `曲线区段:θ = ${base.angleDeg.toFixed(4)}° 位于 6° ~ 16° 区间,满足坡度要求`\n : `曲线区段:θ = ${base.angleDeg.toFixed(4)}° 超出 6° ~ 16° 区间,不满足坡度要求`;\n return { ...base, passes, reason };\n}\n"]}