ocs-calculators 0.1.1 → 0.1.2

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 (136) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +22 -1
  3. package/README_EN.md +1 -1
  4. package/dist/ampacity/index.cjs +17 -0
  5. package/dist/ampacity/index.cjs.map +1 -0
  6. package/dist/ampacity/index.d.cts +68 -0
  7. package/dist/ampacity/index.d.ts +68 -0
  8. package/dist/ampacity/index.js +17 -0
  9. package/dist/ampacity/index.js.map +1 -0
  10. package/dist/chunk-3ERFRRHZ.cjs +119 -0
  11. package/dist/chunk-3ERFRRHZ.cjs.map +1 -0
  12. package/dist/chunk-4UU7WA7N.cjs +107 -0
  13. package/dist/chunk-4UU7WA7N.cjs.map +1 -0
  14. package/dist/chunk-5INEDXRY.cjs +69 -0
  15. package/dist/chunk-5INEDXRY.cjs.map +1 -0
  16. package/dist/chunk-5Q6IASB2.cjs +101 -0
  17. package/dist/chunk-5Q6IASB2.cjs.map +1 -0
  18. package/dist/chunk-746H65EQ.js +91 -0
  19. package/dist/chunk-746H65EQ.js.map +1 -0
  20. package/dist/chunk-CVA4EH2K.js +102 -0
  21. package/dist/chunk-CVA4EH2K.js.map +1 -0
  22. package/dist/chunk-DGO2DCO5.cjs +19 -0
  23. package/dist/chunk-DGO2DCO5.cjs.map +1 -0
  24. package/dist/chunk-FVESJBUD.cjs +95 -0
  25. package/dist/chunk-FVESJBUD.cjs.map +1 -0
  26. package/dist/chunk-GN6QNOUL.js +91 -0
  27. package/dist/chunk-GN6QNOUL.js.map +1 -0
  28. package/dist/chunk-IFVYGNT3.js +107 -0
  29. package/dist/chunk-IFVYGNT3.js.map +1 -0
  30. package/dist/chunk-IUENDAAJ.js +67 -0
  31. package/dist/chunk-IUENDAAJ.js.map +1 -0
  32. package/dist/chunk-J2UXRMTU.cjs +126 -0
  33. package/dist/chunk-J2UXRMTU.cjs.map +1 -0
  34. package/dist/chunk-KOSC6EA3.js +101 -0
  35. package/dist/chunk-KOSC6EA3.js.map +1 -0
  36. package/dist/chunk-LDSV3U4M.js +69 -0
  37. package/dist/chunk-LDSV3U4M.js.map +1 -0
  38. package/dist/chunk-MZBQ4546.cjs +102 -0
  39. package/dist/chunk-MZBQ4546.cjs.map +1 -0
  40. package/dist/chunk-NBFOB2PI.cjs +91 -0
  41. package/dist/chunk-NBFOB2PI.cjs.map +1 -0
  42. package/dist/chunk-NBHEOJ5A.cjs +88 -0
  43. package/dist/chunk-NBHEOJ5A.cjs.map +1 -0
  44. package/dist/chunk-P6KUGPHD.cjs +91 -0
  45. package/dist/chunk-P6KUGPHD.cjs.map +1 -0
  46. package/dist/chunk-QTPXTDGY.js +119 -0
  47. package/dist/chunk-QTPXTDGY.js.map +1 -0
  48. package/dist/chunk-RPKDEFSJ.cjs +78 -0
  49. package/dist/chunk-RPKDEFSJ.cjs.map +1 -0
  50. package/dist/chunk-RVG3LEZQ.js +95 -0
  51. package/dist/chunk-RVG3LEZQ.js.map +1 -0
  52. package/dist/chunk-RVP3IU2L.cjs +67 -0
  53. package/dist/chunk-RVP3IU2L.cjs.map +1 -0
  54. package/dist/chunk-UO2PHBC3.js +126 -0
  55. package/dist/chunk-UO2PHBC3.js.map +1 -0
  56. package/dist/chunk-VAHQDIMW.js +88 -0
  57. package/dist/chunk-VAHQDIMW.js.map +1 -0
  58. package/dist/chunk-WPMKM6NL.js +78 -0
  59. package/dist/chunk-WPMKM6NL.js.map +1 -0
  60. package/dist/chunk-YHDO6XVM.js +19 -0
  61. package/dist/chunk-YHDO6XVM.js.map +1 -0
  62. package/dist/copper/index.cjs +12 -0
  63. package/dist/copper/index.cjs.map +1 -0
  64. package/dist/copper/index.d.cts +57 -0
  65. package/dist/copper/index.d.ts +57 -0
  66. package/dist/copper/index.js +12 -0
  67. package/dist/copper/index.js.map +1 -0
  68. package/dist/curve-stagger/index.cjs +17 -0
  69. package/dist/curve-stagger/index.cjs.map +1 -0
  70. package/dist/curve-stagger/index.d.cts +77 -0
  71. package/dist/curve-stagger/index.d.ts +77 -0
  72. package/dist/curve-stagger/index.js +17 -0
  73. package/dist/curve-stagger/index.js.map +1 -0
  74. package/dist/dropper/index.cjs +15 -0
  75. package/dist/dropper/index.cjs.map +1 -0
  76. package/dist/dropper/index.d.cts +84 -0
  77. package/dist/dropper/index.d.ts +84 -0
  78. package/dist/dropper/index.js +15 -0
  79. package/dist/dropper/index.js.map +1 -0
  80. package/dist/force/index.cjs +17 -0
  81. package/dist/force/index.cjs.map +1 -0
  82. package/dist/force/index.d.cts +69 -0
  83. package/dist/force/index.d.ts +69 -0
  84. package/dist/force/index.js +17 -0
  85. package/dist/force/index.js.map +1 -0
  86. package/dist/icing/index.cjs +9 -0
  87. package/dist/icing/index.cjs.map +1 -0
  88. package/dist/icing/index.d.cts +43 -0
  89. package/dist/icing/index.d.ts +43 -0
  90. package/dist/icing/index.js +9 -0
  91. package/dist/icing/index.js.map +1 -0
  92. package/dist/index.cjs +148 -1198
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.cts +14 -761
  95. package/dist/index.d.ts +14 -761
  96. package/dist/index.js +92 -1039
  97. package/dist/index.js.map +1 -1
  98. package/dist/stroke/index.cjs +19 -0
  99. package/dist/stroke/index.cjs.map +1 -0
  100. package/dist/stroke/index.d.cts +63 -0
  101. package/dist/stroke/index.d.ts +63 -0
  102. package/dist/stroke/index.js +19 -0
  103. package/dist/stroke/index.js.map +1 -0
  104. package/dist/tension/index.cjs +19 -0
  105. package/dist/tension/index.cjs.map +1 -0
  106. package/dist/tension/index.d.cts +85 -0
  107. package/dist/tension/index.d.ts +85 -0
  108. package/dist/tension/index.js +19 -0
  109. package/dist/tension/index.js.map +1 -0
  110. package/dist/types-C2OanO8N.d.cts +33 -0
  111. package/dist/types-C2OanO8N.d.ts +33 -0
  112. package/dist/voltage-drop/index.cjs +12 -0
  113. package/dist/voltage-drop/index.cjs.map +1 -0
  114. package/dist/voltage-drop/index.d.cts +40 -0
  115. package/dist/voltage-drop/index.d.ts +40 -0
  116. package/dist/voltage-drop/index.js +12 -0
  117. package/dist/voltage-drop/index.js.map +1 -0
  118. package/dist/wavespeed/index.cjs +17 -0
  119. package/dist/wavespeed/index.cjs.map +1 -0
  120. package/dist/wavespeed/index.d.cts +58 -0
  121. package/dist/wavespeed/index.d.ts +58 -0
  122. package/dist/wavespeed/index.js +17 -0
  123. package/dist/wavespeed/index.js.map +1 -0
  124. package/dist/wear/index.cjs +13 -0
  125. package/dist/wear/index.cjs.map +1 -0
  126. package/dist/wear/index.d.cts +55 -0
  127. package/dist/wear/index.d.ts +55 -0
  128. package/dist/wear/index.js +13 -0
  129. package/dist/wear/index.js.map +1 -0
  130. package/dist/wind/index.cjs +15 -0
  131. package/dist/wind/index.cjs.map +1 -0
  132. package/dist/wind/index.d.cts +66 -0
  133. package/dist/wind/index.d.ts +66 -0
  134. package/dist/wind/index.js +15 -0
  135. package/dist/wind/index.js.map +1 -0
  136. package/package.json +64 -3
@@ -0,0 +1,107 @@
1
+ // src/curve-stagger/meta.ts
2
+ var curveStaggerMeta = {
3
+ name: "\u66F2\u7EBF\u62C9\u51FA\u503C\u6821\u6838",
4
+ nameEn: "Curve Stagger Clearance Check",
5
+ summary: "\u8BA1\u7B97\u66F2\u7EBF\u533A\u6BB5\u8DE8\u4E2D\u7EFC\u5408\u504F\u79FB\uFF08\u62C9\u51FA\u503C\u5747\u503C\u3001\u66F2\u7EBF\u77E2\u5EA6\u3001\u98CE\u504F\u7684\u7EC4\u5408\uFF09\uFF0C\u4E0E\u53D7\u7535\u5F13\u5BB9\u8BB8\u504F\u79FB\u6BD4\u8F83\u7ED9\u51FA\u5224\u5B9A\u3002",
6
+ formula: [
7
+ "\u5E73\u5747\u62C9\u51FA\u503C\uFF1A\u0101 = (a\u2081 + a\u2082) / 2",
8
+ "\u66F2\u7EBF\u77E2\u5EA6\uFF1Ac = l\xB2 / (8R)\uFF08\u76F4\u7EBF\u6BB5 R = \u221E \u65F6 c = 0\uFF09",
9
+ "\u8D85\u9AD8\u6A2A\u79FB\uFF1A\u03B4 = H\xB7h / l\u2080",
10
+ "\u8DE8\u4E2D\u98CE\u504F\uFF1Ap_w = (\xBD\xB7\u03C1\xB7v\xB2\xB7d\xB7\u03B1) \xB7 l\xB2 / (8T)\uFF08\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF09",
11
+ "\u7EFC\u5408\u504F\u79FB\uFF1Ae = max(|\u0101 + c|, |\u0101 \u2212 c|) + p_w \u2264 [e]"
12
+ ],
13
+ references: [
14
+ "\u4F9D\u636E\u672C\u7AD9 \u62C9\u51FA\u503C\u8BBE\u8BA1 \u6761\u76EE",
15
+ "\u98CE\u504F\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF08sin\xB2\u03B8 = 1\uFF09",
16
+ "\u5BB9\u8BB8\u504F\u79FB [e] \u6309\u53D7\u7535\u5F13\u52A8\u6001\u5305\u7EDC\u7EBF\u53D6\u503C\uFF0C\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6"
17
+ ],
18
+ scope: [
19
+ "\u66F2\u7EBF\u534A\u5F84 R\uFF1A0 ~ 20000 m\uFF08\u76F4\u7EBF\u4F20 0 \u6216 Infinity\uFF09",
20
+ "\u8DE8\u8DDD l\uFF1A20 ~ 80 m",
21
+ "\u62C9\u51FA\u503C a\u2081/a\u2082\uFF1A\u22120.6 ~ 0.6 m\uFF08\u66F2\u7EBF\u5185\u4FA7\u4E3A\u6B63\uFF09",
22
+ "\u98CE\u901F v\uFF1A0 ~ 60 m/s",
23
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 30 mm",
24
+ "\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A0.5 ~ 2",
25
+ "\u5F20\u529B T\uFF1A5 ~ 40 kN",
26
+ "\u6ED1\u677F\u9762\u8DDD\u8F68\u9762 H\uFF1A4 ~ 8 m\uFF1B\u5916\u8F68\u8D85\u9AD8 h\uFF1A0 ~ 0.25 m\uFF1B\u8F68\u8DDD l\u2080 \u9ED8\u8BA4 1.435 m",
27
+ "\u26A0\uFE0F \u7AD9\u70B9\u6E90\u7801\u7684 JSDoc \u5199\u660E\u7EFC\u5408\u504F\u79FB\u542B\u8D85\u9AD8\u6A2A\u79FB\u9879 \u2213\u03B4\uFF0C\u4F46\u5B9E\u73B0\u4E2D \u03B4 \u4EC5\u8BA1\u7B97\u8FD4\u56DE\u3001\u672A\u53C2\u4E0E e \u7684\u5408\u6210\u3002\u672C\u5E93\u6309\u5B9E\u73B0\u884C\u4E3A\u5BF9\u9F50\uFF0C\u8BE6\u89C1\u6D4B\u8BD5\u4E2D\u7684\u8BF4\u660E"
28
+ ],
29
+ 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",
30
+ online: "https://www.itswe.com/calculator/curve-stagger/"
31
+ };
32
+
33
+ // src/curve-stagger/index.ts
34
+ var STANDARD_GAUGE_M = 1.435;
35
+ var DEFAULT_PANTOGRAPH_HEIGHT_M = 6;
36
+ function versineM(spanM, curveRadiusM) {
37
+ if (!(spanM > 0)) {
38
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
39
+ }
40
+ if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {
41
+ return 0;
42
+ }
43
+ return spanM * spanM / (8 * curveRadiusM);
44
+ }
45
+ function cantShiftM(cantM, pantographHeightM = DEFAULT_PANTOGRAPH_HEIGHT_M, gaugeM = STANDARD_GAUGE_M) {
46
+ if (!(cantM >= 0)) {
47
+ throw new RangeError(`\u5916\u8F68\u8D85\u9AD8\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${cantM} m`);
48
+ }
49
+ if (!(pantographHeightM > 0)) {
50
+ throw new RangeError(`\u6ED1\u677F\u9762\u8DDD\u8F68\u9762\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${pantographHeightM} m`);
51
+ }
52
+ if (!(gaugeM > 0)) {
53
+ throw new RangeError(`\u8F68\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${gaugeM} m`);
54
+ }
55
+ return pantographHeightM * cantM / gaugeM;
56
+ }
57
+ function curveStaggerCheck(input) {
58
+ const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;
59
+ if (!(tensionN > 0)) {
60
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
61
+ }
62
+ if (!(wireDiameterM > 0)) {
63
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
64
+ }
65
+ if (!(dragCoefficient > 0)) {
66
+ throw new RangeError(`\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${dragCoefficient}`);
67
+ }
68
+ if (!(input.windSpeedMPerS >= 0)) {
69
+ throw new RangeError(`\u98CE\u901F\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.windSpeedMPerS} m/s`);
70
+ }
71
+ if (!(input.allowableOffsetM > 0)) {
72
+ throw new RangeError(`\u5BB9\u8BB8\u504F\u79FB\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.allowableOffsetM} m`);
73
+ }
74
+ const meanStaggerM = (stagger1M + stagger2M) / 2;
75
+ const c = versineM(spanM, input.curveRadiusM);
76
+ const delta = cantShiftM(
77
+ input.cantM ?? 0,
78
+ input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,
79
+ input.gaugeM ?? STANDARD_GAUGE_M
80
+ );
81
+ const rhoAir = 1.225;
82
+ const windLoadNPerM = 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;
83
+ const pw = windLoadNPerM * spanM * spanM / (8 * tensionN);
84
+ const offsetPlusM = Math.abs(meanStaggerM + c) + pw;
85
+ const offsetMinusM = Math.abs(meanStaggerM - c) + pw;
86
+ const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);
87
+ return {
88
+ meanStaggerM,
89
+ versineM: c,
90
+ cantShiftM: delta,
91
+ windOffsetM: pw,
92
+ offsetPlusM,
93
+ offsetMinusM,
94
+ maxOffsetM,
95
+ passes: maxOffsetM <= input.allowableOffsetM
96
+ };
97
+ }
98
+
99
+ export {
100
+ curveStaggerMeta,
101
+ STANDARD_GAUGE_M,
102
+ DEFAULT_PANTOGRAPH_HEIGHT_M,
103
+ versineM,
104
+ cantShiftM,
105
+ curveStaggerCheck
106
+ };
107
+ //# sourceMappingURL=chunk-IFVYGNT3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/curve-stagger/meta.ts","../src/curve-stagger/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const curveStaggerMeta: CalculatorMeta = {\n name: '曲线拉出值校核',\n nameEn: 'Curve Stagger Clearance Check',\n summary:\n '计算曲线区段跨中综合偏移(拉出值均值、曲线矢度、风偏的组合),与受电弓容许偏移比较给出判定。',\n formula: [\n '平均拉出值:ā = (a₁ + a₂) / 2',\n '曲线矢度:c = l² / (8R)(直线段 R = ∞ 时 c = 0)',\n '超高横移:δ = H·h / l₀',\n '跨中风偏:p_w = (½·ρ·v²·d·α) · l² / (8T)(取风向垂直线路的最不利工况)',\n '综合偏移:e = max(|ā + c|, |ā − c|) + p_w ≤ [e]',\n ],\n references: [\n '依据本站 拉出值设计 条目',\n '风偏取风向垂直线路的最不利工况(sin²θ = 1)',\n '容许偏移 [e] 按受电弓动态包络线取值,以设计文件为准',\n ],\n scope: [\n '曲线半径 R:0 ~ 20000 m(直线传 0 或 Infinity)',\n '跨距 l:20 ~ 80 m',\n '拉出值 a₁/a₂:−0.6 ~ 0.6 m(曲线内侧为正)',\n '风速 v:0 ~ 60 m/s',\n '线索直径 d:1 ~ 30 mm',\n '风载体型系数 α:0.5 ~ 2',\n '张力 T:5 ~ 40 kN',\n '滑板面距轨面 H:4 ~ 8 m;外轨超高 h:0 ~ 0.25 m;轨距 l₀ 默认 1.435 m',\n '⚠️ 站点源码的 JSDoc 写明综合偏移含超高横移项 ∓δ,但实现中 δ 仅计算返回、未参与 e 的合成。本库按实现行为对齐,详见测试中的说明',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/curve-stagger/',\n};\n","export { curveStaggerMeta } from './meta';\n\n/** 标准轨距,m */\nexport const STANDARD_GAUGE_M = 1.435;\n\n/** 滑板面距轨面的常用值,m */\nexport const DEFAULT_PANTOGRAPH_HEIGHT_M = 6.0;\n\nexport interface CurveStaggerInput {\n /** 曲线半径 R,m。直线段传 0 或 Infinity */\n readonly curveRadiusM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 定位点 1 拉出值 a₁,m(曲线内侧为正) */\n readonly stagger1M: number;\n /** 定位点 2 拉出值 a₂,m(曲线内侧为正) */\n readonly stagger2M: number;\n /** 风速 v,m/s */\n readonly windSpeedMPerS: number;\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 风载体型系数 α */\n readonly dragCoefficient: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 容许偏移 [e],m */\n readonly allowableOffsetM: number;\n /** 滑板面距轨面 H,m。缺省 6.0 */\n readonly pantographHeightM?: number;\n /** 外轨超高 h,m。缺省 0 */\n readonly cantM?: number;\n /** 轨距 l₀,m。缺省 1.435 */\n readonly gaugeM?: number;\n}\n\nexport interface CurveStaggerResult {\n /** 平均拉出值 ā,m */\n readonly meanStaggerM: number;\n /** 曲线矢度 c = l²/(8R),m。直线段为 0 */\n readonly versineM: number;\n /** 超高横移 δ = H·h/l₀,m */\n readonly cantShiftM: number;\n /** 跨中风偏 p_w,m */\n readonly windOffsetM: number;\n /** 矢度与拉出值同向时的偏移,m */\n readonly offsetPlusM: number;\n /** 矢度与拉出值反向时的偏移,m */\n readonly offsetMinusM: number;\n /** 取两者较大值,m */\n readonly maxOffsetM: number;\n /** 是否满足容许偏移 */\n readonly passes: boolean;\n}\n\n/**\n * 曲线矢度:c = l² / (8R),m。\n * 直线段(R = 0 或 Infinity)返回 0。\n */\nexport function versineM(spanM: number, curveRadiusM: number): number {\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {\n return 0;\n }\n return (spanM * spanM) / (8 * curveRadiusM);\n}\n\n/**\n * 超高横移:δ = H·h / l₀,m。\n *\n * @param cantM 外轨超高 h,m\n * @param pantographHeightM 滑板面距轨面 H,m\n * @param gaugeM 轨距 l₀,m\n */\nexport function cantShiftM(\n cantM: number,\n pantographHeightM: number = DEFAULT_PANTOGRAPH_HEIGHT_M,\n gaugeM: number = STANDARD_GAUGE_M,\n): number {\n if (!(cantM >= 0)) {\n throw new RangeError(`外轨超高不能为负,收到 ${cantM} m`);\n }\n if (!(pantographHeightM > 0)) {\n throw new RangeError(`滑板面距轨面必须为正数,收到 ${pantographHeightM} m`);\n }\n if (!(gaugeM > 0)) {\n throw new RangeError(`轨距必须为正数,收到 ${gaugeM} m`);\n }\n return (pantographHeightM * cantM) / gaugeM;\n}\n\n/**\n * 曲线区段跨中综合偏移校核。\n *\n * 风偏取风向垂直线路的最不利工况(sin²θ = 1)。\n *\n * ⚠️ 与站点源码一致:超高横移 δ 会计算并返回,但**不参与** e 的合成。\n * 站点 JSDoc 描述的公式为 `e = |ā ± c ∓ δ| + p_w`,与其实现不符;\n * 若站点后续修正,本库的 offsetPlusM / offsetMinusM 需同步调整。\n */\nexport function curveStaggerCheck(input: CurveStaggerInput): CurveStaggerResult {\n const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(dragCoefficient > 0)) {\n throw new RangeError(`风载体型系数必须为正数,收到 ${dragCoefficient}`);\n }\n if (!(input.windSpeedMPerS >= 0)) {\n throw new RangeError(`风速不能为负,收到 ${input.windSpeedMPerS} m/s`);\n }\n if (!(input.allowableOffsetM > 0)) {\n throw new RangeError(`容许偏移必须为正数,收到 ${input.allowableOffsetM} m`);\n }\n\n const meanStaggerM = (stagger1M + stagger2M) / 2;\n const c = versineM(spanM, input.curveRadiusM);\n const delta = cantShiftM(\n input.cantM ?? 0,\n input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,\n input.gaugeM ?? STANDARD_GAUGE_M,\n );\n\n // 单位风荷载 p = ½·ρ·v²·d·α·sin²θ,取 sin²θ = 1(风向垂直线路最不利)\n const rhoAir = 1.225;\n const windLoadNPerM =\n 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;\n const pw = (windLoadNPerM * spanM * spanM) / (8 * tensionN);\n\n const offsetPlusM = Math.abs(meanStaggerM + c) + pw;\n const offsetMinusM = Math.abs(meanStaggerM - c) + pw;\n const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);\n\n return {\n meanStaggerM,\n versineM: c,\n cantShiftM: delta,\n windOffsetM: pw,\n offsetPlusM,\n offsetMinusM,\n maxOffsetM,\n passes: maxOffsetM <= input.allowableOffsetM,\n };\n}\n"],"mappings":";AAEO,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;AC7BO,IAAM,mBAAmB;AAGzB,IAAM,8BAA8B;AAoDpC,SAAS,SAAS,OAAe,cAA8B;AACpE,MAAI,EAAE,QAAQ,IAAI;AAChB,UAAM,IAAI,WAAW,gEAAc,KAAK,IAAI;AAAA,EAC9C;AACA,MAAI,EAAE,eAAe,MAAM,CAAC,OAAO,SAAS,YAAY,GAAG;AACzD,WAAO;AAAA,EACT;AACA,SAAQ,QAAQ,SAAU,IAAI;AAChC;AASO,SAAS,WACd,OACA,oBAA4B,6BAC5B,SAAiB,kBACT;AACR,MAAI,EAAE,SAAS,IAAI;AACjB,UAAM,IAAI,WAAW,sEAAe,KAAK,IAAI;AAAA,EAC/C;AACA,MAAI,EAAE,oBAAoB,IAAI;AAC5B,UAAM,IAAI,WAAW,wFAAkB,iBAAiB,IAAI;AAAA,EAC9D;AACA,MAAI,EAAE,SAAS,IAAI;AACjB,UAAM,IAAI,WAAW,gEAAc,MAAM,IAAI;AAAA,EAC/C;AACA,SAAQ,oBAAoB,QAAS;AACvC;AAWO,SAAS,kBAAkB,OAA8C;AAC9E,QAAM,EAAE,OAAO,WAAW,WAAW,eAAe,iBAAiB,SAAS,IAAI;AAElF,MAAI,EAAE,WAAW,IAAI;AACnB,UAAM,IAAI,WAAW,gEAAc,QAAQ,IAAI;AAAA,EACjD;AACA,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,IAAI;AAAA,EACxD;AACA,MAAI,EAAE,kBAAkB,IAAI;AAC1B,UAAM,IAAI,WAAW,wFAAkB,eAAe,EAAE;AAAA,EAC1D;AACA,MAAI,EAAE,MAAM,kBAAkB,IAAI;AAChC,UAAM,IAAI,WAAW,0DAAa,MAAM,cAAc,MAAM;AAAA,EAC9D;AACA,MAAI,EAAE,MAAM,mBAAmB,IAAI;AACjC,UAAM,IAAI,WAAW,4EAAgB,MAAM,gBAAgB,IAAI;AAAA,EACjE;AAEA,QAAM,gBAAgB,YAAY,aAAa;AAC/C,QAAM,IAAI,SAAS,OAAO,MAAM,YAAY;AAC5C,QAAM,QAAQ;AAAA,IACZ,MAAM,SAAS;AAAA,IACf,MAAM,qBAAqB;AAAA,IAC3B,MAAM,UAAU;AAAA,EAClB;AAGA,QAAM,SAAS;AACf,QAAM,gBACJ,MAAM,SAAS,MAAM,iBAAiB,MAAM,iBAAiB,gBAAgB;AAC/E,QAAM,KAAM,gBAAgB,QAAQ,SAAU,IAAI;AAElD,QAAM,cAAc,KAAK,IAAI,eAAe,CAAC,IAAI;AACjD,QAAM,eAAe,KAAK,IAAI,eAAe,CAAC,IAAI;AAClD,QAAM,aAAa,KAAK,IAAI,aAAa,YAAY;AAErD,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,MAAM;AAAA,EAC9B;AACF;","names":[]}
@@ -0,0 +1,67 @@
1
+ import {
2
+ resistanceAtTempOhmPerKm
3
+ } from "./chunk-YHDO6XVM.js";
4
+
5
+ // src/voltage-drop/meta.ts
6
+ var voltageDropMeta = {
7
+ name: "\u7535\u538B\u964D\u6821\u6838",
8
+ nameEn: "Voltage Drop Check",
9
+ summary: "\u6309\u6E29\u5EA6\u4FEE\u6B63\u540E\u7684\u5355\u4F4D\u7535\u963B\u8BA1\u7B97\u4F9B\u7535\u81C2\u7535\u538B\u635F\u5931 \u0394U \u4E0E\u672B\u7AEF\u7535\u538B\uFF0C\u7528\u4E8E\u4F9B\u7535\u81C2\u957F\u5EA6\u4E0E\u5BFC\u7EBF\u622A\u9762\u6821\u6838\u3002",
10
+ formula: [
11
+ "\u5355\u4F4D\u7535\u963B\u6E29\u5EA6\u4FEE\u6B63\uFF1Ar_T = r\u2082\u2080\xB7[1 + \u03B1\xB7(T \u2212 20)]\uFF08\u03B1 = 0.00393 /\u2103\uFF09",
12
+ "\u5E76\u8054 n \u8DEF\u65F6\uFF1Ar_T / n",
13
+ "\u7535\u538B\u635F\u5931\uFF1A\u0394U = I \xB7 r_T \xB7 L\uFF08r_T \u5355\u4F4D \u03A9/km\uFF0CL \u5355\u4F4D km\uFF09",
14
+ "\u672B\u7AEF\u7535\u538B\uFF1AU_end = U\u2080 \u2212 \u0394U\uFF1B\u538B\u964D\u7387 = \u0394U / U\u2080"
15
+ ],
16
+ references: [
17
+ "\u4F9D\u636E\u672C\u7AD9 \u4F9B\u7535\u8BA1\u7B97 / \u7535\u6C14\u8BBE\u8BA1 \u6761\u76EE",
18
+ "\u672B\u7AEF\u7535\u538B\u9650\u503C\uFF1A25kV \u4F53\u7CFB\u5E38\u6309 20kV \u638C\u63E1\uFF1B\u5B9E\u9645\u9650\u503C\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E0E\u4F9B\u7535\u8BA1\u7B97\u4E66\u4E3A\u51C6"
19
+ ],
20
+ scope: [
21
+ "\u6BCD\u7EBF\u7535\u538B U\u2080\uFF1A20000 ~ 30000 V",
22
+ "\u6301\u7EED\u7535\u6D41 I\uFF1A10 ~ 3000 A",
23
+ "\u5355\u4F4D\u7535\u963B r\u2082\u2080\uFF1A0.05 ~ 1 \u03A9/km",
24
+ "\u4F9B\u7535\u81C2\u7B49\u6548\u957F\u5EA6 L\uFF1A1 ~ 60 km",
25
+ "\u73AF\u5883\u6E29\u5EA6\uFF1A\u221240 ~ 80 \u2103",
26
+ "\u5355\u56DE\u8DEF\u96C6\u4E2D\u8D1F\u8377\u6A21\u578B\uFF0C\u672A\u8003\u8651\u8D1F\u8377\u6CBF\u4F9B\u7535\u81C2\u5206\u5E03\u4E0E\u518D\u751F\u5236\u52A8"
27
+ ],
28
+ 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",
29
+ online: "https://www.itswe.com/calculator/voltage-drop/"
30
+ };
31
+
32
+ // src/voltage-drop/index.ts
33
+ var DEFAULT_MIN_END_VOLTAGE_V = 2e4;
34
+ function voltageDropCheck(input) {
35
+ const { busVoltageV, currentA, r20OhmPerKm, feederLengthKm } = input;
36
+ if (!(busVoltageV > 0)) {
37
+ throw new RangeError(`\u6BCD\u7EBF\u7535\u538B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${busVoltageV} V`);
38
+ }
39
+ if (!(currentA > 0)) {
40
+ throw new RangeError(`\u6301\u7EED\u7535\u6D41\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${currentA} A`);
41
+ }
42
+ if (!(feederLengthKm > 0)) {
43
+ throw new RangeError(`\u4F9B\u7535\u81C2\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${feederLengthKm} km`);
44
+ }
45
+ const parallelCount = input.parallelCount ?? 1;
46
+ if (!(parallelCount > 0) || !Number.isInteger(parallelCount)) {
47
+ throw new RangeError(`\u5E76\u8054\u5BFC\u7EBF\u6570\u5FC5\u987B\u4E3A\u6B63\u6574\u6570\uFF0C\u6536\u5230 ${parallelCount}`);
48
+ }
49
+ const minEndVoltageV = input.minEndVoltageV ?? DEFAULT_MIN_END_VOLTAGE_V;
50
+ const rT = resistanceAtTempOhmPerKm(r20OhmPerKm, input.tempDegC ?? 25) / parallelCount;
51
+ const voltageDropV = currentA * rT * feederLengthKm;
52
+ const endVoltageV = busVoltageV - voltageDropV;
53
+ return {
54
+ rTOhmPerKm: rT,
55
+ voltageDropV,
56
+ endVoltageV,
57
+ dropPercent: voltageDropV / busVoltageV * 100,
58
+ passes: endVoltageV >= minEndVoltageV
59
+ };
60
+ }
61
+
62
+ export {
63
+ voltageDropMeta,
64
+ DEFAULT_MIN_END_VOLTAGE_V,
65
+ voltageDropCheck
66
+ };
67
+ //# sourceMappingURL=chunk-IUENDAAJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/voltage-drop/meta.ts","../src/voltage-drop/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const voltageDropMeta: CalculatorMeta = {\n name: '电压降校核',\n nameEn: 'Voltage Drop Check',\n summary:\n '按温度修正后的单位电阻计算供电臂电压损失 ΔU 与末端电压,用于供电臂长度与导线截面校核。',\n formula: [\n '单位电阻温度修正:r_T = r₂₀·[1 + α·(T − 20)](α = 0.00393 /℃)',\n '并联 n 路时:r_T / n',\n '电压损失:ΔU = I · r_T · L(r_T 单位 Ω/km,L 单位 km)',\n '末端电压:U_end = U₀ − ΔU;压降率 = ΔU / U₀',\n ],\n references: [\n '依据本站 供电计算 / 电气设计 条目',\n '末端电压限值:25kV 体系常按 20kV 掌握;实际限值以设计文件与供电计算书为准',\n ],\n scope: [\n '母线电压 U₀:20000 ~ 30000 V',\n '持续电流 I:10 ~ 3000 A',\n '单位电阻 r₂₀:0.05 ~ 1 Ω/km',\n '供电臂等效长度 L:1 ~ 60 km',\n '环境温度:−40 ~ 80 ℃',\n '单回路集中负荷模型,未考虑负荷沿供电臂分布与再生制动',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/voltage-drop/',\n};\n","export { voltageDropMeta } from './meta';\n\n/** 25kV 体系常用的末端电压下限,V */\nexport const DEFAULT_MIN_END_VOLTAGE_V = 20000;\n\n// 电阻温度修正统一来自 src/common/resistance.ts(copper 与 voltage-drop 共用)\nimport { resistanceAtTempOhmPerKm } from '../common/resistance';\n\nexport interface VoltageDropInput {\n /** 变电所母线电压 U₀,V */\n readonly busVoltageV: number;\n /** 持续电流 I,A */\n readonly currentA: number;\n /** 20℃ 单位电阻 r₂₀,Ω/km */\n readonly r20OhmPerKm: number;\n /** 供电臂等效长度 L,km */\n readonly feederLengthKm: number;\n /** 环境温度 T,℃。缺省 25 */\n readonly tempDegC?: number;\n /** 并联导线数。缺省 1 */\n readonly parallelCount?: number;\n /** 末端最低允许电压,V。缺省 20000 */\n readonly minEndVoltageV?: number;\n}\n\nexport interface VoltageDropResult {\n /** 温度修正(并含并联折减)后的单位电阻 r_T,Ω/km */\n readonly rTOhmPerKm: number;\n /** 电压损失 ΔU,V */\n readonly voltageDropV: number;\n /** 末端电压 U_end,V */\n readonly endVoltageV: number;\n /** 压降率,% */\n readonly dropPercent: number;\n /** 末端电压是否满足要求 */\n readonly passes: boolean;\n}\n\n/**\n * 电压降校核:ΔU = I·r_T·L(并联 n 路时 r_T/n),U_end = U₀ − ΔU。\n */\nexport function voltageDropCheck(input: VoltageDropInput): VoltageDropResult {\n const { busVoltageV, currentA, r20OhmPerKm, feederLengthKm } = input;\n\n if (!(busVoltageV > 0)) {\n throw new RangeError(`母线电压必须为正数,收到 ${busVoltageV} V`);\n }\n if (!(currentA > 0)) {\n throw new RangeError(`持续电流必须为正数,收到 ${currentA} A`);\n }\n if (!(feederLengthKm > 0)) {\n throw new RangeError(`供电臂长度必须为正数,收到 ${feederLengthKm} km`);\n }\n\n const parallelCount = input.parallelCount ?? 1;\n if (!(parallelCount > 0) || !Number.isInteger(parallelCount)) {\n throw new RangeError(`并联导线数必须为正整数,收到 ${parallelCount}`);\n }\n\n const minEndVoltageV = input.minEndVoltageV ?? DEFAULT_MIN_END_VOLTAGE_V;\n\n const rT =\n resistanceAtTempOhmPerKm(r20OhmPerKm, input.tempDegC ?? 25) / parallelCount;\n const voltageDropV = currentA * rT * feederLengthKm;\n const endVoltageV = busVoltageV - voltageDropV;\n\n return {\n rTOhmPerKm: rT,\n voltageDropV,\n endVoltageV,\n dropPercent: (voltageDropV / busVoltageV) * 100,\n passes: endVoltageV >= minEndVoltageV,\n };\n}\n"],"mappings":";;;;;AAEO,IAAM,kBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACxBO,IAAM,4BAA4B;AAsClC,SAAS,iBAAiB,OAA4C;AAC3E,QAAM,EAAE,aAAa,UAAU,aAAa,eAAe,IAAI;AAE/D,MAAI,EAAE,cAAc,IAAI;AACtB,UAAM,IAAI,WAAW,4EAAgB,WAAW,IAAI;AAAA,EACtD;AACA,MAAI,EAAE,WAAW,IAAI;AACnB,UAAM,IAAI,WAAW,4EAAgB,QAAQ,IAAI;AAAA,EACnD;AACA,MAAI,EAAE,iBAAiB,IAAI;AACzB,UAAM,IAAI,WAAW,kFAAiB,cAAc,KAAK;AAAA,EAC3D;AAEA,QAAM,gBAAgB,MAAM,iBAAiB;AAC7C,MAAI,EAAE,gBAAgB,MAAM,CAAC,OAAO,UAAU,aAAa,GAAG;AAC5D,UAAM,IAAI,WAAW,wFAAkB,aAAa,EAAE;AAAA,EACxD;AAEA,QAAM,iBAAiB,MAAM,kBAAkB;AAE/C,QAAM,KACJ,yBAAyB,aAAa,MAAM,YAAY,EAAE,IAAI;AAChE,QAAM,eAAe,WAAW,KAAK;AACrC,QAAM,cAAc,cAAc;AAElC,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,aAAc,eAAe,cAAe;AAAA,IAC5C,QAAQ,eAAe;AAAA,EACzB;AACF;","names":[]}
@@ -0,0 +1,126 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/dropper/meta.ts
2
+ var dropperMeta = {
3
+ name: "\u540A\u5F26\u957F\u5EA6\u8BA1\u7B97",
4
+ nameEn: "Dropper Length Calculator",
5
+ summary: "\u6309\u629B\u7269\u7EBF\u5F1B\u5EA6\u516C\u5F0F\u8BA1\u7B97\u94FE\u5F62\u60AC\u6302\u5404\u540A\u5F26\u957F\u5EA6\uFF0C\u652F\u6301\u7B80\u5355\u94FE\u5F62\u4E0E\u5F39\u6027\u94FE\u5F62\u4E24\u79CD\u60AC\u6302\u7C7B\u578B\u3002",
6
+ formula: [
7
+ "\u63A5\u89E6\u7EBF\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Af_c(x) = q_c\xB7x\xB7(L\u2212x) / (2\xB7T_c)",
8
+ "\u627F\u529B\u7D22\u5F1B\u5EA6\uFF1Af_m(x) = q_m\xB7x\xB7(L\u2212x) / (2\xB7T_m)",
9
+ "\u7B80\u5355\u94FE\u5F62\uFF1Al_i = H \u2212 f_c(x_i)",
10
+ "\u5F39\u6027\u94FE\u5F62\uFF08\u8BA1\u5165\u627F\u529B\u7D22\u5F1B\u5EA6\uFF09\uFF1Al_i = H \u2212 f_c(x_i) + f_m(x_i)",
11
+ "\u8DE8\u4E2D\u6700\u5927\u5F1B\u5EA6\uFF1Af_max = q_c\xB7L\xB2 / (8\xB7T_c)"
12
+ ],
13
+ references: [
14
+ "\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E f/L \u2264 1/10 \u7684\u5C0F\u5F1B\u5EA6\u5DE5\u51B5",
15
+ "\u540A\u5F26\u95F4\u8DDD\u987B\u80FD\u6574\u9664\u8DE8\u8DDD\uFF1B\u5B9E\u9645\u540A\u5F26\u5E03\u7F6E\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6",
16
+ "\u5F39\u6027\u94FE\u5F62\u60AC\u6302\u987B\u540C\u65F6\u63D0\u4F9B\u627F\u529B\u7D22\u5F20\u529B\u4E0E\u5355\u4F4D\u8377\u8F7D"
17
+ ],
18
+ scope: [
19
+ "\u8DE8\u8DDD L\uFF1A5 ~ 80 m",
20
+ "\u63A5\u89E6\u7EBF\u5F20\u529B T_c\uFF1A1 ~ 40 kN",
21
+ "\u7ED3\u6784\u9AD8\u5EA6 H\uFF1A0.3 ~ 3 m",
22
+ "\u63A5\u89E6\u7EBF\u5355\u4F4D\u8377\u8F7D q_c\uFF1A0.001 ~ 0.1 kN/m",
23
+ "\u540A\u5F26\u95F4\u8DDD d\uFF1A1 ~ 15 m\uFF0C\u987B\u80FD\u6574\u9664\u8DE8\u8DDD",
24
+ "\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u5927\u5F1B\u5EA6\u5DE5\u51B5\u8BEF\u5DEE\u589E\u5927",
25
+ "\u672A\u8BA1\u5165\u540A\u5F26\u81EA\u8EAB\u4F38\u957F\u3001\u6E29\u5EA6\u53D8\u5316\u4E0E\u96F6\u90E8\u4EF6\u5236\u9020\u516C\u5DEE"
26
+ ],
27
+ 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",
28
+ online: "https://www.itswe.com/calculator/dropper/"
29
+ };
30
+
31
+ // src/dropper/index.ts
32
+ function parabolaSagM(xM, spanM, loadKNPerM, tensionKN) {
33
+ if (!(tensionKN > 0)) {
34
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
35
+ }
36
+ if (xM < 0 || xM > spanM) {
37
+ throw new RangeError(`\u4F4D\u7F6E x = ${xM} m \u8D85\u51FA\u8DE8\u8DDD 0 ~ ${spanM} m`);
38
+ }
39
+ return loadKNPerM * xM * (spanM - xM) / (2 * tensionKN);
40
+ }
41
+ function maxParabolaSagM(spanM, loadKNPerM, tensionKN) {
42
+ return loadKNPerM * spanM * spanM / (8 * tensionKN);
43
+ }
44
+ function dropperPositionsM(spanM, spacingM) {
45
+ if (!(spanM > 0)) {
46
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
47
+ }
48
+ if (!(spacingM > 0)) {
49
+ throw new RangeError(`\u540A\u5F26\u95F4\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spacingM} m`);
50
+ }
51
+ const intervals = spanM / spacingM;
52
+ const rounded = Math.round(intervals);
53
+ if (Math.abs(intervals - rounded) > 1e-9 || rounded < 1) {
54
+ throw new RangeError(
55
+ `\u540A\u5F26\u95F4\u8DDD ${spacingM} m \u4E0D\u80FD\u6574\u9664\u8DE8\u8DDD ${spanM} m\uFF08\u5F97\u5230 ${intervals} \u6BB5\uFF09`
56
+ );
57
+ }
58
+ return Array.from({ length: rounded + 1 }, (_, i) => i * spacingM);
59
+ }
60
+ function dropperLengths(input) {
61
+ const {
62
+ suspension,
63
+ spanM,
64
+ contactTensionKN,
65
+ structureHeightM,
66
+ contactLoadKNPerM,
67
+ dropperSpacingM: spacingM
68
+ } = input;
69
+ if (!(contactTensionKN > 0)) {
70
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${contactTensionKN} kN`);
71
+ }
72
+ if (!(contactLoadKNPerM > 0)) {
73
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5355\u4F4D\u8377\u8F7D\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${contactLoadKNPerM} kN/m`);
74
+ }
75
+ if (!(structureHeightM > 0)) {
76
+ throw new RangeError(`\u7ED3\u6784\u9AD8\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${structureHeightM} m`);
77
+ }
78
+ if (suspension === "elastic") {
79
+ const m = input.messenger;
80
+ if (!m) {
81
+ throw new RangeError("\u5F39\u6027\u94FE\u5F62\u60AC\u6302\u5FC5\u987B\u63D0\u4F9B\u627F\u529B\u7D22\u53C2\u6570\uFF08messenger\uFF09");
82
+ }
83
+ if (!(m.tensionKN > 0) || !(m.loadKNPerM > 0)) {
84
+ throw new RangeError("\u627F\u529B\u7D22\u5F20\u529B\u4E0E\u5355\u4F4D\u8377\u8F7D\u5FC5\u987B\u4E3A\u6B63\u6570");
85
+ }
86
+ }
87
+ const positions = dropperPositionsM(spanM, spacingM);
88
+ const messenger = suspension === "elastic" ? input.messenger : null;
89
+ const points = positions.map((xM, index) => {
90
+ const contactSag = parabolaSagM(
91
+ xM,
92
+ spanM,
93
+ contactLoadKNPerM,
94
+ contactTensionKN
95
+ );
96
+ const messengerSag = messenger && messenger !== null ? parabolaSagM(xM, spanM, messenger.loadKNPerM, messenger.tensionKN) : 0;
97
+ const dropperLengthM = structureHeightM - contactSag + messengerSag;
98
+ if (dropperLengthM <= 0) {
99
+ throw new RangeError(
100
+ `x = ${xM} m \u5904\u540A\u5F26\u957F\u5EA6\u975E\u6B63\uFF08${dropperLengthM.toFixed(4)} m\uFF09\uFF1A\u7ED3\u6784\u9AD8\u5EA6 ${structureHeightM} m \u4E0D\u8DB3\uFF0C\u8BF7\u590D\u6838\u8F93\u5165`
101
+ );
102
+ }
103
+ return { index, positionM: xM, contactSagM: contactSag, messengerSagM: messengerSag, dropperLengthM };
104
+ });
105
+ let maxSagM = 0;
106
+ let shortestDropperM = Number.POSITIVE_INFINITY;
107
+ for (const p of points) {
108
+ if (p.contactSagM > maxSagM) maxSagM = p.contactSagM;
109
+ if (p.dropperLengthM < shortestDropperM) shortestDropperM = p.dropperLengthM;
110
+ }
111
+ return {
112
+ points,
113
+ maxSagM,
114
+ shortestDropperM,
115
+ count: points.length
116
+ };
117
+ }
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+ exports.dropperMeta = dropperMeta; exports.parabolaSagM = parabolaSagM; exports.maxParabolaSagM = maxParabolaSagM; exports.dropperPositionsM = dropperPositionsM; exports.dropperLengths = dropperLengths;
126
+ //# sourceMappingURL=chunk-J2UXRMTU.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-J2UXRMTU.cjs","../src/dropper/meta.ts","../src/dropper/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-J2UXRMTU.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const dropperMeta: CalculatorMeta = {\n name: '吊弦长度计算',\n nameEn: 'Dropper Length Calculator',\n summary:\n '按抛物线弛度公式计算链形悬挂各吊弦长度,支持简单链形与弹性链形两种悬挂类型。',\n formula: [\n '接触线弛度(抛物线近似):f_c(x) = q_c·x·(L−x) / (2·T_c)',\n '承力索弛度:f_m(x) = q_m·x·(L−x) / (2·T_m)',\n '简单链形:l_i = H − f_c(x_i)',\n '弹性链形(计入承力索弛度):l_i = H − f_c(x_i) + f_m(x_i)',\n '跨中最大弛度:f_max = q_c·L² / (8·T_c)',\n ],\n references: [\n '抛物线近似,适用于 f/L ≤ 1/10 的小弛度工况',\n '吊弦间距须能整除跨距;实际吊弦布置以设计文件为准',\n '弹性链形悬挂须同时提供承力索张力与单位荷载',\n ],\n scope: [\n '跨距 L:5 ~ 80 m',\n '接触线张力 T_c:1 ~ 40 kN',\n '结构高度 H:0.3 ~ 3 m',\n '接触线单位荷载 q_c:0.001 ~ 0.1 kN/m',\n '吊弦间距 d:1 ~ 15 m,须能整除跨距',\n '抛物线近似,大弛度工况误差增大',\n '未计入吊弦自身伸长、温度变化与零部件制造公差',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/dropper/',\n};\n","export { dropperMeta } from './meta';\n\n/** 悬挂类型 */\nexport type SuspensionType = 'simple' | 'elastic';\n\nexport interface DropperInput {\n /** 悬挂类型。弹性链形须同时提供 messenger 参数 */\n readonly suspension: SuspensionType;\n /** 跨距 L,m */\n readonly spanM: number;\n /** 接触线张力 T_c,kN */\n readonly contactTensionKN: number;\n /** 结构高度 H,m */\n readonly structureHeightM: number;\n /** 接触线单位荷载 q_c,kN/m */\n readonly contactLoadKNPerM: number;\n /** 吊弦间距 d,m,须能整除跨距 */\n readonly dropperSpacingM: number;\n /**\n * 承力索参数。弹性链形悬挂('elastic')必填,\n * 简单链形悬挂传 null 或不传。\n */\n readonly messenger?: {\n /** 承力索张力 T_m,kN */\n readonly tensionKN: number;\n /** 承力索单位荷载 q_m,kN/m */\n readonly loadKNPerM: number;\n } | null;\n}\n\n/** 单个吊弦点的计算结果 */\nexport interface DropperPoint {\n /** 序号 i(0 为起始端) */\n readonly index: number;\n /** 距起始端的距离 x,m */\n readonly positionM: number;\n /** 接触线弛度 f_c(x),m */\n readonly contactSagM: number;\n /** 承力索弛度 f_m(x),m(简单链形恒为 0) */\n readonly messengerSagM: number;\n /** 吊弦长度 l,m */\n readonly dropperLengthM: number;\n}\n\nexport interface DropperResult {\n readonly points: readonly DropperPoint[];\n /** 跨中最大弛度 f_max,m */\n readonly maxSagM: number;\n /** 最短吊弦长度,m(位于跨中) */\n readonly shortestDropperM: number;\n /** 吊弦数量(含两端) */\n readonly count: number;\n}\n\n/**\n * 抛物线弛度:f(x) = q·x·(L−x) / (2·T)\n *\n * 对接触线和承力索通用,区别只在传哪一组 q / T。\n *\n * @param xM 距起始端距离,m\n * @param spanM 跨距 L,m\n * @param loadKNPerM 单位荷载 q,kN/m\n * @param tensionKN 张力 T,kN\n * @returns 该点弛度,m\n */\nexport function parabolaSagM(\n xM: number,\n spanM: number,\n loadKNPerM: number,\n tensionKN: number,\n): number {\n if (!(tensionKN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionKN} kN`);\n }\n if (xM < 0 || xM > spanM) {\n throw new RangeError(`位置 x = ${xM} m 超出跨距 0 ~ ${spanM} m`);\n }\n return (loadKNPerM * xM * (spanM - xM)) / (2 * tensionKN);\n}\n\n/**\n * 跨中最大弛度:f_max = q·L² / (8·T)\n */\nexport function maxParabolaSagM(\n spanM: number,\n loadKNPerM: number,\n tensionKN: number,\n): number {\n return (loadKNPerM * spanM * spanM) / (8 * tensionKN);\n}\n\n/**\n * 生成吊弦点位(含两端)。\n * @param spanM 跨距 L,m\n * @param spacingM 吊弦间距 d,m,须能整除跨距\n * @returns 各点位距起始端的距离,m\n */\nexport function dropperPositionsM(spanM: number, spacingM: number): number[] {\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(spacingM > 0)) {\n throw new RangeError(`吊弦间距必须为正数,收到 ${spacingM} m`);\n }\n const intervals = spanM / spacingM;\n const rounded = Math.round(intervals);\n if (Math.abs(intervals - rounded) > 1e-9 || rounded < 1) {\n throw new RangeError(\n `吊弦间距 ${spacingM} m 不能整除跨距 ${spanM} m(得到 ${intervals} 段)`,\n );\n }\n return Array.from({ length: rounded + 1 }, (_, i) => i * spacingM);\n}\n\n/**\n * 计算整跨各吊弦长度。\n *\n * 简单链形:l_i = H − f_c(x_i)\n * 弹性链形:l_i = H − f_c(x_i) + f_m(x_i)\n */\nexport function dropperLengths(input: DropperInput): DropperResult {\n const {\n suspension,\n spanM,\n contactTensionKN,\n structureHeightM,\n contactLoadKNPerM,\n dropperSpacingM: spacingM,\n } = input;\n\n if (!(contactTensionKN > 0)) {\n throw new RangeError(`接触线张力必须为正数,收到 ${contactTensionKN} kN`);\n }\n if (!(contactLoadKNPerM > 0)) {\n throw new RangeError(`接触线单位荷载必须为正数,收到 ${contactLoadKNPerM} kN/m`);\n }\n if (!(structureHeightM > 0)) {\n throw new RangeError(`结构高度必须为正数,收到 ${structureHeightM} m`);\n }\n\n if (suspension === 'elastic') {\n const m = input.messenger;\n if (!m) {\n throw new RangeError('弹性链形悬挂必须提供承力索参数(messenger)');\n }\n if (!(m.tensionKN > 0) || !(m.loadKNPerM > 0)) {\n throw new RangeError('承力索张力与单位荷载必须为正数');\n }\n }\n\n const positions = dropperPositionsM(spanM, spacingM);\n const messenger = suspension === 'elastic' ? input.messenger : null;\n\n const points: DropperPoint[] = positions.map((xM, index) => {\n const contactSag = parabolaSagM(\n xM,\n spanM,\n contactLoadKNPerM,\n contactTensionKN,\n );\n const messengerSag =\n messenger && messenger !== null\n ? parabolaSagM(xM, spanM, messenger.loadKNPerM, messenger.tensionKN)\n : 0;\n\n const dropperLengthM = structureHeightM - contactSag + messengerSag;\n if (dropperLengthM <= 0) {\n throw new RangeError(\n `x = ${xM} m 处吊弦长度非正(${dropperLengthM.toFixed(4)} m):` +\n `结构高度 ${structureHeightM} m 不足,请复核输入`,\n );\n }\n\n return { index, positionM: xM, contactSagM: contactSag, messengerSagM: messengerSag, dropperLengthM };\n });\n\n let maxSagM = 0;\n let shortestDropperM = Number.POSITIVE_INFINITY;\n for (const p of points) {\n if (p.contactSagM > maxSagM) maxSagM = p.contactSagM;\n if (p.dropperLengthM < shortestDropperM) shortestDropperM = p.dropperLengthM;\n }\n\n return {\n points,\n maxSagM,\n shortestDropperM,\n count: points.length,\n };\n}\n"]}
@@ -0,0 +1,101 @@
1
+ // src/stroke/meta.ts
2
+ var strokeMeta = {
3
+ name: "\u8865\u507F\u884C\u7A0B",
4
+ nameEn: "Compensation Stroke",
5
+ summary: "\u6309\u6E29\u5EA6\u4F38\u7F29\u91CF\u516C\u5F0F\u8BA1\u7B97\u951A\u6BB5\u7EBF\u7D22\u4F38\u7F29\u91CF\u4E0E\u8865\u507F\u88C5\u7F6E\u6240\u9700\u884C\u7A0B\uFF0C\u53EF\u5BF9\u7167\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u6821\u6838\u3002",
6
+ formula: [
7
+ "\u6E29\u5EA6\u4F38\u7F29\u91CF\uFF1A\u0394L = \u03B1\xB7L\xB7\u0394t",
8
+ "\u8865\u507F\u884C\u7A0B\u8BBE\u8BA1\u503C\uFF08\u542B\u88D5\u5EA6\uFF09\uFF1AS = n\xB7\u0394L + S\u2080"
9
+ ],
10
+ references: [
11
+ "\u5168\u8865\u507F\u951A\u6BB5\u63A5\u89E6\u7EBF\u4E0E\u627F\u529B\u7D22\u987B\u5206\u522B\u8BA1\u7B97\uFF08\u5404\u81EA \u03B1/L \u4E0D\u540C\uFF09\uFF1B\u534A\u8865\u507F\u4EC5\u8BA1\u7B97\u63A5\u89E6\u7EBF\u4FA7",
12
+ "\u4F20\u52A8\u6BD4\u5E38\u89C1\u89C4\u683C\uFF1A\u6ED1\u8F6E\u7EC4 1:2/1:3\uFF08\u4E3B\u6D41\uFF09\u30011:4 \u89C1\u4E8E\u6559\u6750\u6848\u4F8B\uFF0C\u65E0\u6807\u51C6\u7EDF\u4E00\u6863\u4F4D\u8868",
13
+ "\u5B89\u88C5\u88D5\u5EA6\u53EF\u53C2\u7167\u8865\u507F\u5668 a/b \u503C\uFF1A\u4EFB\u4F55\u60C5\u51B5\u4E0B\u4E0D\u5C0F\u4E8E 200mm\uFF08\u539F\u94C1\u8FD0\u30142007\u301569\u53F7\u7B2C87\u6761\uFF0C\u5DF2\u7531\u94C1\u603B\u8FD0\u30142017\u30159\u53F7\u627F\u63A5\uFF09\uFF1B\u8BBE\u8BA1\u53D6\u503C\u60EF\u4F8B\u4E0D\u5C0F\u4E8E 300mm\uFF0C\u5C5E\u6559\u6750/\u8BBE\u8BA1\u60EF\u4F8B\u800C\u975E\u89C4\u7A0B\u6761\u6B3E",
14
+ "\u8865\u507F\u88C5\u7F6E\u4EA7\u54C1\u8981\u6C42\u89C1 TB/T 2075.12-2024\uFF08\u6ED1\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u3001TB/T 2075.13-2024\uFF08\u68D8\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u4E0E TB/T 2073-2020\uFF08\u96F6\u90E8\u4EF6\u6280\u672F\u6761\u4EF6\uFF09"
15
+ ],
16
+ scope: [
17
+ "\u951A\u6BB5\u957F\u5EA6 L \u4E3A\u4E24\u7AEF\u951A\u56FA\u70B9\u4E4B\u95F4\u957F\u5EA6",
18
+ "\u8BBE\u8BA1\u6E29\u5DEE \u0394t \u4E3A\u6700\u9AD8\u4E0E\u6700\u4F4E\u8BBE\u8BA1\u6E29\u5EA6\u4E4B\u5DEE",
19
+ "\u94DC\u5408\u91D1\u7EBF\u81A8\u80C0\u7CFB\u6570\u7EA6 1.7\xD710\u207B\u2075/\u2103\uFF08EN 50149 \u94DC\u9521\u63A5\u89E6\u7EBF\u6570\u636E\u8868\uFF09",
20
+ "\u5168\u8865\u507F\u951A\u6BB5\u627F\u529B\u7D22\u4FA7\u987B\u53E6\u884C\u8BA1\u7B97",
21
+ "\u53C2\u6570\u53D6\u503C\u4EE5\u8BBE\u8BA1\u89C4\u7A0B\u4E3A\u51C6"
22
+ ],
23
+ 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",
24
+ online: "https://www.itswe.com/calculator/stroke/"
25
+ };
26
+
27
+ // src/stroke/index.ts
28
+ var TRANSMISSION_RATIOS = [2, 3, 4];
29
+ var MIN_MARGIN_MM = 200;
30
+ var CONVENTIONAL_MARGIN_MM = 300;
31
+ function elongationMM(expansionPerDegC, anchorLengthM, tempRangeDegC) {
32
+ if (!(expansionPerDegC > 0)) {
33
+ throw new RangeError(`\u7EBF\u81A8\u80C0\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${expansionPerDegC} 1/\u2103`);
34
+ }
35
+ if (!(anchorLengthM > 0)) {
36
+ throw new RangeError(`\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${anchorLengthM} m`);
37
+ }
38
+ if (!(tempRangeDegC > 0)) {
39
+ throw new RangeError(`\u8BBE\u8BA1\u6E29\u5DEE\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tempRangeDegC} \u2103`);
40
+ }
41
+ return expansionPerDegC * anchorLengthM * tempRangeDegC * 1e3;
42
+ }
43
+ function requiredStrokeMM(elongation, ratio, marginMM) {
44
+ if (!(elongation >= 0)) {
45
+ throw new RangeError(`\u4F38\u7F29\u91CF\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${elongation} mm`);
46
+ }
47
+ if (!(marginMM >= 0)) {
48
+ throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${marginMM} mm`);
49
+ }
50
+ return ratio * elongation + marginMM;
51
+ }
52
+ function strokeCheck(input) {
53
+ const { transmissionRatio, allowableStrokeMM } = input;
54
+ if (!TRANSMISSION_RATIOS.includes(transmissionRatio)) {
55
+ throw new RangeError(
56
+ `\u4F20\u52A8\u6BD4\u5E94\u4E3A ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(" / ")}\uFF0C\u6536\u5230 1:${transmissionRatio}`
57
+ );
58
+ }
59
+ if (!(input.marginMM >= 0)) {
60
+ throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.marginMM} mm`);
61
+ }
62
+ const elongation = elongationMM(
63
+ input.expansionPerDegC,
64
+ input.anchorLengthM,
65
+ input.tempRangeDegC
66
+ );
67
+ const perDegreeMM = elongation / input.tempRangeDegC;
68
+ const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);
69
+ if (allowableStrokeMM === null) {
70
+ return {
71
+ perDegreeMM,
72
+ elongationMM: elongation,
73
+ requiredStrokeMM: required,
74
+ allowableStrokeMM: null,
75
+ marginMM: null,
76
+ verdict: "not-assessed"
77
+ };
78
+ }
79
+ if (!(allowableStrokeMM > 0)) {
80
+ throw new RangeError(`\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${allowableStrokeMM} mm`);
81
+ }
82
+ return {
83
+ perDegreeMM,
84
+ elongationMM: elongation,
85
+ requiredStrokeMM: required,
86
+ allowableStrokeMM,
87
+ marginMM: allowableStrokeMM - required,
88
+ verdict: required <= allowableStrokeMM ? "pass" : "fail"
89
+ };
90
+ }
91
+
92
+ export {
93
+ strokeMeta,
94
+ TRANSMISSION_RATIOS,
95
+ MIN_MARGIN_MM,
96
+ CONVENTIONAL_MARGIN_MM,
97
+ elongationMM,
98
+ requiredStrokeMM,
99
+ strokeCheck
100
+ };
101
+ //# sourceMappingURL=chunk-KOSC6EA3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/stroke/meta.ts","../src/stroke/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const strokeMeta: CalculatorMeta = {\n name: '补偿行程',\n nameEn: 'Compensation Stroke',\n summary:\n '按温度伸缩量公式计算锚段线索伸缩量与补偿装置所需行程,可对照装置许用行程校核。',\n formula: [\n '温度伸缩量:ΔL = α·L·Δt',\n '补偿行程设计值(含裕度):S = n·ΔL + S₀',\n ],\n references: [\n '全补偿锚段接触线与承力索须分别计算(各自 α/L 不同);半补偿仅计算接触线侧',\n '传动比常见规格:滑轮组 1:2/1:3(主流)、1:4 见于教材案例,无标准统一档位表',\n '安装裕度可参照补偿器 a/b 值:任何情况下不小于 200mm(原铁运〔2007〕69号第87条,已由铁总运〔2017〕9号承接);设计取值惯例不小于 300mm,属教材/设计惯例而非规程条款',\n '补偿装置产品要求见 TB/T 2075.12-2024(滑轮补偿装置)、TB/T 2075.13-2024(棘轮补偿装置)与 TB/T 2073-2020(零部件技术条件)',\n ],\n scope: [\n '锚段长度 L 为两端锚固点之间长度',\n '设计温差 Δt 为最高与最低设计温度之差',\n '铜合金线膨胀系数约 1.7×10⁻⁵/℃(EN 50149 铜锡接触线数据表)',\n '全补偿锚段承力索侧须另行计算',\n '参数取值以设计规程为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/stroke/',\n};\n","export { strokeMeta } from './meta';\n\n/** 补偿装置传动比(滑轮组/棘轮),n:1 中的 n */\nexport type TransmissionRatio = 2 | 3 | 4;\n\n/** 常见传动比档位 */\nexport const TRANSMISSION_RATIOS: readonly TransmissionRatio[] = [2, 3, 4];\n\n/** 安装裕度规程下限,mm(原铁运〔2007〕69号第87条) */\nexport const MIN_MARGIN_MM = 200;\n\n/** 安装裕度设计惯例值,mm(教材/设计惯例,非规程条款) */\nexport const CONVENTIONAL_MARGIN_MM = 300;\n\nexport interface StrokeInput {\n /** 锚段长度 L,m(两端锚固点之间) */\n readonly anchorLengthM: number;\n /** 设计温差 Δt,℃(最高与最低设计温度之差) */\n readonly tempRangeDegC: number;\n /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */\n readonly expansionPerDegC: number;\n /** 补偿传动比 n(1:2 / 1:3 / 1:4) */\n readonly transmissionRatio: TransmissionRatio;\n /** 安装裕度 S₀,mm */\n readonly marginMM: number;\n /** 装置许用行程,mm。传 null 则不判定 */\n readonly allowableStrokeMM: number | null;\n}\n\nexport interface StrokeResult {\n /** 每℃伸缩量 α·L,mm/℃ */\n readonly perDegreeMM: number;\n /** 总伸缩量 ΔL = α·L·Δt,mm */\n readonly elongationMM: number;\n /** 所需行程 S = n·ΔL + S₀,mm */\n readonly requiredStrokeMM: number;\n readonly allowableStrokeMM: number | null;\n /** 富余量 = 许用行程 − 所需行程,mm。未提供许用行程时为 null */\n readonly marginMM: number | null;\n readonly verdict: 'pass' | 'fail' | 'not-assessed';\n}\n\n/**\n * 温度伸缩量:ΔL = α·L·Δt,mm。\n *\n * @param expansionPerDegC 线膨胀系数 α,1/℃\n * @param anchorLengthM 锚段长度 L,m\n * @param tempRangeDegC 设计温差 Δt,℃\n * @returns 伸缩量,mm\n */\nexport function elongationMM(\n expansionPerDegC: number,\n anchorLengthM: number,\n tempRangeDegC: number,\n): number {\n if (!(expansionPerDegC > 0)) {\n throw new RangeError(`线膨胀系数必须为正数,收到 ${expansionPerDegC} 1/℃`);\n }\n if (!(anchorLengthM > 0)) {\n throw new RangeError(`锚段长度必须为正数,收到 ${anchorLengthM} m`);\n }\n if (!(tempRangeDegC > 0)) {\n throw new RangeError(`设计温差必须为正数,收到 ${tempRangeDegC} ℃`);\n }\n return expansionPerDegC * anchorLengthM * tempRangeDegC * 1000;\n}\n\n/**\n * 补偿行程设计值(含裕度):S = n·ΔL + S₀,mm。\n *\n * @param elongation 总伸缩量 ΔL,mm\n * @param ratio 传动比 n\n * @param marginMM 安装裕度 S₀,mm\n */\nexport function requiredStrokeMM(\n elongation: number,\n ratio: TransmissionRatio,\n marginMM: number,\n): number {\n if (!(elongation >= 0)) {\n throw new RangeError(`伸缩量不能为负,收到 ${elongation} mm`);\n }\n if (!(marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${marginMM} mm`);\n }\n return ratio * elongation + marginMM;\n}\n\n/**\n * 计算锚段伸缩量与补偿装置所需行程,并可选对照许用行程校核。\n *\n * ⚠️ 全补偿锚段接触线与承力索须分别计算;本函数单次只算一根线索。\n */\nexport function strokeCheck(input: StrokeInput): StrokeResult {\n const { transmissionRatio, allowableStrokeMM } = input;\n\n if (!(TRANSMISSION_RATIOS as readonly number[]).includes(transmissionRatio)) {\n throw new RangeError(\n `传动比应为 ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(' / ')},收到 1:${transmissionRatio}`,\n );\n }\n if (!(input.marginMM >= 0)) {\n throw new RangeError(`安装裕度不能为负,收到 ${input.marginMM} mm`);\n }\n\n const elongation = elongationMM(\n input.expansionPerDegC,\n input.anchorLengthM,\n input.tempRangeDegC,\n );\n const perDegreeMM = elongation / input.tempRangeDegC;\n const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);\n\n if (allowableStrokeMM === null) {\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM: null,\n marginMM: null,\n verdict: 'not-assessed',\n };\n }\n\n if (!(allowableStrokeMM > 0)) {\n throw new RangeError(`装置许用行程必须为正数,收到 ${allowableStrokeMM} mm`);\n }\n\n return {\n perDegreeMM,\n elongationMM: elongation,\n requiredStrokeMM: required,\n allowableStrokeMM,\n marginMM: allowableStrokeMM - required,\n verdict: required <= allowableStrokeMM ? 'pass' : 'fail',\n };\n}\n"],"mappings":";AAEO,IAAM,aAA6B;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACpBO,IAAM,sBAAoD,CAAC,GAAG,GAAG,CAAC;AAGlE,IAAM,gBAAgB;AAGtB,IAAM,yBAAyB;AAsC/B,SAAS,aACd,kBACA,eACA,eACQ;AACR,MAAI,EAAE,mBAAmB,IAAI;AAC3B,UAAM,IAAI,WAAW,kFAAiB,gBAAgB,WAAM;AAAA,EAC9D;AACA,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,IAAI;AAAA,EACxD;AACA,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,SAAI;AAAA,EACxD;AACA,SAAO,mBAAmB,gBAAgB,gBAAgB;AAC5D;AASO,SAAS,iBACd,YACA,OACA,UACQ;AACR,MAAI,EAAE,cAAc,IAAI;AACtB,UAAM,IAAI,WAAW,gEAAc,UAAU,KAAK;AAAA,EACpD;AACA,MAAI,EAAE,YAAY,IAAI;AACpB,UAAM,IAAI,WAAW,sEAAe,QAAQ,KAAK;AAAA,EACnD;AACA,SAAO,QAAQ,aAAa;AAC9B;AAOO,SAAS,YAAY,OAAkC;AAC5D,QAAM,EAAE,mBAAmB,kBAAkB,IAAI;AAEjD,MAAI,CAAE,oBAA0C,SAAS,iBAAiB,GAAG;AAC3E,UAAM,IAAI;AAAA,MACR,kCAAS,oBAAoB,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC,wBAAS,iBAAiB;AAAA,IACzF;AAAA,EACF;AACA,MAAI,EAAE,MAAM,YAAY,IAAI;AAC1B,UAAM,IAAI,WAAW,sEAAe,MAAM,QAAQ,KAAK;AAAA,EACzD;AAEA,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,QAAM,cAAc,aAAa,MAAM;AACvC,QAAM,WAAW,iBAAiB,YAAY,mBAAmB,MAAM,QAAQ;AAE/E,MAAI,sBAAsB,MAAM;AAC9B,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,EAAE,oBAAoB,IAAI;AAC5B,UAAM,IAAI,WAAW,wFAAkB,iBAAiB,KAAK;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB;AAAA,IACA,UAAU,oBAAoB;AAAA,IAC9B,SAAS,YAAY,oBAAoB,SAAS;AAAA,EACpD;AACF;","names":[]}
@@ -0,0 +1,69 @@
1
+ // src/wear/meta.ts
2
+ var wearMeta = {
3
+ name: "\u63A5\u89E6\u7EBF\u78E8\u8017\u7387",
4
+ nameEn: "Contact Wire Wear Ratio",
5
+ summary: "\u6839\u636E\u539F\u622A\u9762\u79EF\u4E0E\u5B9E\u6D4B\u6B8B\u5B58\u622A\u9762\u8BA1\u7B97\u78E8\u8017\u7387 \u03B7\uFF0C\u03B7 > 20% \u65F6\u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF\u3002",
6
+ formula: [
7
+ "\u78E8\u8017\u7387\uFF1A\u03B7 = (A\u2080 \u2212 A) / A\u2080 \xD7 100%",
8
+ "\u5224\u5B9A\u51C6\u5219\uFF1A\u03B7 > 20% \u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF",
9
+ "\u6B8B\u5F84\u6362\u7B97\uFF08\u8FD1\u4F3C\uFF09\uFF1AA = \u03C0\xB7d\xB2 / 4"
10
+ ],
11
+ references: [
12
+ "\u539F\u622A\u9762\u79EF\u6765\u6E90 TB/T 2809-2017\u300A\u7535\u6C14\u5316\u94C1\u8DEF\u7528\u94DC\u53CA\u94DC\u5408\u91D1\u63A5\u89E6\u7EBF\u300B",
13
+ "\u6807\u79F0\u622A\u9762 120/150 mm\xB2 \u4E3A\u540D\u4E49\u503C\uFF0C\u6807\u51C6\u53E6\u5217\u8BA1\u7B97\u622A\u9762 121/151 mm\xB2\uFF0C\u5B9E\u9645\u622A\u9762\u7531 TB/T 2809-2017 \u88682 \u5916\u5F62\u5C3A\u5BF8\u516C\u5DEE\u5E26\u63A7\u5236",
14
+ "\u78E8\u8017\u66F4\u6362\u9608\u503C\u8BF7\u4EE5\u6700\u65B0\u7248\u8FD0\u7EF4\u89C4\u7A0B\u4E3A\u51C6"
15
+ ],
16
+ scope: [
17
+ "\u6B8B\u5F84\u6362\u7B97\u6309\u5706\u622A\u9762\u8FD1\u4F3C\uFF0C\u63A5\u89E6\u7EBF\u5B9E\u9645\u4E3A\u68AF\u5F62\u622A\u9762\uFF0C\u6362\u7B97\u503C\u5B58\u5728\u7CFB\u7EDF\u6027\u504F\u5DEE",
18
+ "\u672A\u8003\u8651\u78E8\u8017\u6CBF\u8DE8\u8DDD\u65B9\u5411\u7684\u4E0D\u5747\u5300\u5206\u5E03",
19
+ "\u5B9E\u9645\u4EA7\u54C1\u622A\u9762\u4EE5\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
20
+ ],
21
+ 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",
22
+ online: "https://www.itswe.com/calculator/wear/"
23
+ };
24
+
25
+ // src/wear/index.ts
26
+ var DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;
27
+ function sectionFromDiameterMM2(diameterMM) {
28
+ if (!(diameterMM > 0)) {
29
+ throw new RangeError(`\u6B8B\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${diameterMM} mm`);
30
+ }
31
+ return Math.PI * diameterMM * diameterMM / 4;
32
+ }
33
+ function wearRatio(input) {
34
+ const { originalSectionMM2: a0 } = input;
35
+ if (!(a0 > 0)) {
36
+ throw new RangeError(`\u539F\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${a0} mm\xB2`);
37
+ }
38
+ const residualSectionMM2 = input.mode === "area" ? input.residualSectionMM2 : sectionFromDiameterMM2(input.residualDiameterMM);
39
+ if (!(residualSectionMM2 > 0)) {
40
+ throw new RangeError(`\u6B8B\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${residualSectionMM2} mm\xB2`);
41
+ }
42
+ if (residualSectionMM2 > a0) {
43
+ throw new RangeError(
44
+ `\u6B8B\u622A\u9762\u79EF ${residualSectionMM2.toFixed(2)} mm\xB2 \u4E0D\u80FD\u5927\u4E8E\u539F\u622A\u9762\u79EF ${a0} mm\xB2`
45
+ );
46
+ }
47
+ const thresholdPercent = input.replacementThresholdPercent ?? DEFAULT_REPLACEMENT_THRESHOLD_PERCENT;
48
+ if (!(thresholdPercent > 0)) {
49
+ throw new RangeError(`\u66F4\u6362\u9608\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thresholdPercent}%`);
50
+ }
51
+ const sectionLossMM2 = a0 - residualSectionMM2;
52
+ const wearPercent = sectionLossMM2 / a0 * 100;
53
+ return {
54
+ originalSectionMM2: a0,
55
+ residualSectionMM2,
56
+ sectionLossMM2,
57
+ wearPercent,
58
+ thresholdPercent,
59
+ verdict: wearPercent > thresholdPercent ? "replace" : "keep"
60
+ };
61
+ }
62
+
63
+ export {
64
+ wearMeta,
65
+ DEFAULT_REPLACEMENT_THRESHOLD_PERCENT,
66
+ sectionFromDiameterMM2,
67
+ wearRatio
68
+ };
69
+ //# sourceMappingURL=chunk-LDSV3U4M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wear/meta.ts","../src/wear/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const wearMeta: CalculatorMeta = {\n name: '接触线磨耗率',\n nameEn: 'Contact Wire Wear Ratio',\n summary: '根据原截面积与实测残存截面计算磨耗率 η,η > 20% 时建议更换接触线。',\n formula: [\n '磨耗率:η = (A₀ − A) / A₀ × 100%',\n '判定准则:η > 20% 建议更换接触线',\n '残径换算(近似):A = π·d² / 4',\n ],\n references: [\n '原截面积来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》',\n '标称截面 120/150 mm² 为名义值,标准另列计算截面 121/151 mm²,实际截面由 TB/T 2809-2017 表2 外形尺寸公差带控制',\n '磨耗更换阈值请以最新版运维规程为准',\n ],\n scope: [\n '残径换算按圆截面近似,接触线实际为梯形截面,换算值存在系统性偏差',\n '未考虑磨耗沿跨距方向的不均匀分布',\n '实际产品截面以出厂检验单为准',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wear/',\n};\n","export { wearMeta } from './meta';\n\n/** 更换阈值缺省值:η > 20% 建议更换接触线 */\nexport const DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;\n\n/** 磨耗计算公共输入 */\nexport interface WearBaseInput {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 更换阈值 η,%。缺省 20 */\n readonly replacementThresholdPercent?: number;\n}\n\n/** 按实测残截面积计算 */\nexport interface WearByAreaInput extends WearBaseInput {\n readonly mode: 'area';\n /** 实测残截面积 A,mm²,不得大于 A₀ */\n readonly residualSectionMM2: number;\n}\n\n/** 按实测残径计算(圆截面近似 A = πd²/4) */\nexport interface WearByDiameterInput extends WearBaseInput {\n readonly mode: 'residual-diameter';\n /** 实测残径 d,mm */\n readonly residualDiameterMM: number;\n}\n\nexport type WearInput = WearByAreaInput | WearByDiameterInput;\n\n/** 判定结论:keep = 继续使用,replace = 建议更换 */\nexport type WearVerdict = 'keep' | 'replace';\n\n/** 磨耗率计算结果 */\nexport interface WearResult {\n /** 原截面积 A₀,mm² */\n readonly originalSectionMM2: number;\n /** 参与计算的残截面积 A,mm²(残径模式为换算值) */\n readonly residualSectionMM2: number;\n /** 截面损失 A₀ − A,mm² */\n readonly sectionLossMM2: number;\n /** 磨耗率 η,% */\n readonly wearPercent: number;\n /** 使用的更换阈值,% */\n readonly thresholdPercent: number;\n readonly verdict: WearVerdict;\n}\n\n/** 圆截面近似:由实测残径 d(mm)换算残截面积 A = π·d²/4(mm²) */\nexport function sectionFromDiameterMM2(diameterMM: number): number {\n if (!(diameterMM > 0)) {\n throw new RangeError(`残径必须为正数,收到 ${diameterMM} mm`);\n }\n return (Math.PI * diameterMM * diameterMM) / 4;\n}\n\n/**\n * 接触线磨耗率:η = (A₀ − A) / A₀ × 100%。\n *\n * 支持两种输入模式:直接给残截面积(`mode: 'area'`),或给实测残径\n * 按 A = π·d²/4 换算(`mode: 'residual-diameter'`)。\n *\n * 判定:η **严格大于**阈值(缺省 20%)判为 `replace`,等于阈值仍为 `keep`。\n */\nexport function wearRatio(input: WearInput): WearResult {\n const { originalSectionMM2: a0 } = input;\n if (!(a0 > 0)) {\n throw new RangeError(`原截面积必须为正数,收到 ${a0} mm²`);\n }\n\n const residualSectionMM2 =\n input.mode === 'area'\n ? input.residualSectionMM2\n : sectionFromDiameterMM2(input.residualDiameterMM);\n if (!(residualSectionMM2 > 0)) {\n throw new RangeError(`残截面积必须为正数,收到 ${residualSectionMM2} mm²`);\n }\n if (residualSectionMM2 > a0) {\n throw new RangeError(\n `残截面积 ${residualSectionMM2.toFixed(2)} mm² 不能大于原截面积 ${a0} mm²`,\n );\n }\n\n const thresholdPercent =\n input.replacementThresholdPercent ?? DEFAULT_REPLACEMENT_THRESHOLD_PERCENT;\n if (!(thresholdPercent > 0)) {\n throw new RangeError(`更换阈值必须为正数,收到 ${thresholdPercent}%`);\n }\n\n const sectionLossMM2 = a0 - residualSectionMM2;\n const wearPercent = (sectionLossMM2 / a0) * 100;\n\n return {\n originalSectionMM2: a0,\n residualSectionMM2,\n sectionLossMM2,\n wearPercent,\n thresholdPercent,\n verdict: wearPercent > thresholdPercent ? 'replace' : 'keep',\n };\n}\n"],"mappings":";AAEO,IAAM,WAA2B;AAAA,EACtC,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;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACpBO,IAAM,wCAAwC;AA6C9C,SAAS,uBAAuB,YAA4B;AACjE,MAAI,EAAE,aAAa,IAAI;AACrB,UAAM,IAAI,WAAW,gEAAc,UAAU,KAAK;AAAA,EACpD;AACA,SAAQ,KAAK,KAAK,aAAa,aAAc;AAC/C;AAUO,SAAS,UAAU,OAA8B;AACtD,QAAM,EAAE,oBAAoB,GAAG,IAAI;AACnC,MAAI,EAAE,KAAK,IAAI;AACb,UAAM,IAAI,WAAW,4EAAgB,EAAE,SAAM;AAAA,EAC/C;AAEA,QAAM,qBACJ,MAAM,SAAS,SACX,MAAM,qBACN,uBAAuB,MAAM,kBAAkB;AACrD,MAAI,EAAE,qBAAqB,IAAI;AAC7B,UAAM,IAAI,WAAW,4EAAgB,kBAAkB,SAAM;AAAA,EAC/D;AACA,MAAI,qBAAqB,IAAI;AAC3B,UAAM,IAAI;AAAA,MACR,4BAAQ,mBAAmB,QAAQ,CAAC,CAAC,4DAAiB,EAAE;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,mBACJ,MAAM,+BAA+B;AACvC,MAAI,EAAE,mBAAmB,IAAI;AAC3B,UAAM,IAAI,WAAW,4EAAgB,gBAAgB,GAAG;AAAA,EAC1D;AAEA,QAAM,iBAAiB,KAAK;AAC5B,QAAM,cAAe,iBAAiB,KAAM;AAE5C,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,cAAc,mBAAmB,YAAY;AAAA,EACxD;AACF;","names":[]}