ocs-calculators 0.1.0 → 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 +45 -4
  2. package/README.md +47 -5
  3. package/README_EN.md +11 -5
  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 +162 -1220
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.cts +47 -775
  95. package/dist/index.d.ts +47 -775
  96. package/dist/index.js +108 -1063
  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,91 @@
1
+ // src/icing/meta.ts
2
+ var icingMeta = {
3
+ name: "\u8986\u51B0\u8377\u8F7D\u6821\u6838",
4
+ nameEn: "Ice Load Check",
5
+ summary: "\u6309\u51B0\u7B52\u6A21\u578B\u8BA1\u7B97\u8986\u51B0\u8377\u8F7D\uFF0C\u7ED9\u51FA\u8986\u51B0\u540E\u7684\u603B\u5782\u76F4\u8377\u8F7D\u3001\u5F1B\u5EA6\u53CA\u76F8\u5BF9\u65E0\u51B0\u5DE5\u51B5\u7684\u589E\u5E45\u3002",
6
+ formula: [
7
+ "\u51B0\u7B52\u6A21\u578B\u51B0\u91CD\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)",
8
+ "\u8986\u51B0\u540E\u603B\u5782\u76F4\u8377\u8F7D\uFF1Ag_total = g_self + g_ice",
9
+ "\u65E0\u51B0\u5F1B\u5EA6\uFF1Af\u2080 = g_self\xB7l\xB2 / (8T)",
10
+ "\u8986\u51B0\u5F1B\u5EA6\uFF1Af_ice = g_total\xB7l\xB2 / (8T)",
11
+ "\u5F1B\u5EA6\u589E\u5E45\uFF1A(f_ice / f\u2080 \u2212 1) \xD7 100%"
12
+ ],
13
+ references: [
14
+ "\u4F9D\u636E\u672C\u7AD9 \u8986\u51B0\u8377\u8F7D / \u8377\u8F7D\u8BA1\u7B97 \u6761\u76EE",
15
+ "\u51B0\u5BC6\u5EA6\u9ED8\u8BA4 900 kg/m\xB3\uFF0C\u8F7B\u8986\u51B0\u5730\u533A\u53EF\u53D6\u66F4\u5C0F\u503C\uFF0C\u4EE5\u5F53\u5730\u6C14\u8C61\u8D44\u6599\u4E3A\u51C6",
16
+ "\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u672A\u8003\u8651\u4E0D\u89C4\u5219\u8986\u51B0\u5F62\u6001"
17
+ ],
18
+ scope: [
19
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 40 mm",
20
+ "\u8986\u51B0\u539A\u5EA6 b\uFF1A0 ~ 50 mm\uFF080 \u8868\u793A\u65E0\u51B0\uFF09",
21
+ "\u5F20\u529B T\uFF1A1 ~ 40 kN",
22
+ "\u8DE8\u8DDD l\uFF1A10 ~ 90 m",
23
+ "\u7EBF\u7D22\u81EA\u91CD g_self\uFF1A1 ~ 60 N/m",
24
+ "\u51B0\u5BC6\u5EA6 \u03C1_ice\uFF1A500 ~ 950 kg/m\xB3",
25
+ "\u5747\u5300\u51B0\u7B52\u6A21\u578B\uFF0C\u672A\u8003\u8651\u4E0D\u5747\u5300\u8986\u51B0\u3001\u8131\u51B0\u8DF3\u8DC3\u4E0E\u98CE\u51B0\u7EC4\u5408",
26
+ "\u5F1B\u5EA6\u6309\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u672A\u8003\u8651\u8986\u51B0\u540E\u5F20\u529B\u53D8\u5316\uFF08\u672A\u4E0E\u72B6\u6001\u65B9\u7A0B\u8026\u5408\uFF09"
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/icing/"
30
+ };
31
+
32
+ // src/types.ts
33
+ var G0 = 9.81;
34
+
35
+ // src/common/ice.ts
36
+ var DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;
37
+ function iceLoadNPerM(params) {
38
+ const { wireDiameterM, iceThicknessM } = params;
39
+ const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;
40
+ if (!(wireDiameterM > 0)) {
41
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
42
+ }
43
+ if (!(iceThicknessM >= 0)) {
44
+ throw new RangeError(`\u8986\u51B0\u539A\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${iceThicknessM} m`);
45
+ }
46
+ if (!(rho > 0)) {
47
+ throw new RangeError(`\u51B0\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
48
+ }
49
+ if (iceThicknessM === 0) return 0;
50
+ return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);
51
+ }
52
+
53
+ // src/icing/index.ts
54
+ function icingCheck(input) {
55
+ const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;
56
+ if (!(tensionN > 0)) {
57
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
58
+ }
59
+ if (!(spanM > 0)) {
60
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
61
+ }
62
+ if (!(selfWeightNPerM > 0)) {
63
+ throw new RangeError(`\u7EBF\u7D22\u81EA\u91CD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${selfWeightNPerM} N/m`);
64
+ }
65
+ const iceParams = {
66
+ wireDiameterM,
67
+ iceThicknessM,
68
+ ...input.iceDensityKgPerM3 === void 0 ? {} : { iceDensityKgPerM3: input.iceDensityKgPerM3 }
69
+ };
70
+ const gIce = iceLoadNPerM(iceParams);
71
+ const gTotal = selfWeightNPerM + gIce;
72
+ const fNoIce = selfWeightNPerM * spanM * spanM / (8 * tensionN);
73
+ const fIce = gTotal * spanM * spanM / (8 * tensionN);
74
+ return {
75
+ iceLoadNPerM: gIce,
76
+ totalLoadNPerM: gTotal,
77
+ sagNoIceM: fNoIce,
78
+ sagWithIceM: fIce,
79
+ growthPercent: (fIce / fNoIce - 1) * 100,
80
+ heavy: gIce > selfWeightNPerM
81
+ };
82
+ }
83
+
84
+ export {
85
+ G0,
86
+ DEFAULT_ICE_DENSITY_KG_PER_M3,
87
+ iceLoadNPerM,
88
+ icingMeta,
89
+ icingCheck
90
+ };
91
+ //# sourceMappingURL=chunk-GN6QNOUL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icing/meta.ts","../src/types.ts","../src/common/ice.ts","../src/icing/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const icingMeta: CalculatorMeta = {\n name: '覆冰荷载校核',\n nameEn: 'Ice Load Check',\n summary:\n '按冰筒模型计算覆冰荷载,给出覆冰后的总垂直荷载、弛度及相对无冰工况的增幅。',\n formula: [\n '冰筒模型冰重:g_ice = ρ_ice · g₀ · π · b · (d + b)',\n '覆冰后总垂直荷载:g_total = g_self + g_ice',\n '无冰弛度:f₀ = g_self·l² / (8T)',\n '覆冰弛度:f_ice = g_total·l² / (8T)',\n '弛度增幅:(f_ice / f₀ − 1) × 100%',\n ],\n references: [\n '依据本站 覆冰荷载 / 荷载计算 条目',\n '冰密度默认 900 kg/m³,轻覆冰地区可取更小值,以当地气象资料为准',\n '均匀冰筒假设,未考虑不规则覆冰形态',\n ],\n scope: [\n '线索直径 d:1 ~ 40 mm',\n '覆冰厚度 b:0 ~ 50 mm(0 表示无冰)',\n '张力 T:1 ~ 40 kN',\n '跨距 l:10 ~ 90 m',\n '线索自重 g_self:1 ~ 60 N/m',\n '冰密度 ρ_ice:500 ~ 950 kg/m³',\n '均匀冰筒模型,未考虑不均匀覆冰、脱冰跳跃与风冰组合',\n '弛度按抛物线近似,未考虑覆冰后张力变化(未与状态方程耦合)',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/icing/',\n};\n","/**\n * 全库公共类型定义。\n *\n * 命名约定(重要):\n * 所有数值字段的单位都写在变量名末尾,例如 tensionKN / spanM / crossSectionMM2。\n * 工程计算里单位混淆是头号 bug 来源,宁可名字长,也不要靠注释记单位。\n */\n\n/**\n * 每个计算器模块必须导出的元信息。\n * 这是本库区别于\"玩具代码\"的核心 —— 公式、依据、适用范围、免责声明全部可机读。\n */\nexport interface CalculatorMeta {\n /** 计算器中文名 */\n readonly name: string;\n /** 计算器英文名,用于国际检索 */\n readonly nameEn: string;\n /** 一句话用途说明 */\n readonly summary: string;\n /** 核心公式,LaTeX 或纯文本,可多条 */\n readonly formula: readonly string[];\n /** 参考依据:标准号、设计手册、教材。注意标注该标准是否真正包含此公式 */\n readonly references: readonly string[];\n /** 适用范围与已知限制 */\n readonly scope: readonly string[];\n /** 免责声明 */\n readonly disclaimer: string;\n /** 在线版本地址 */\n readonly online: string;\n}\n\n/** 重力加速度,N/kg(m/s²) */\nexport const G0 = 9.81;\n","/**\n * 覆冰冰筒模型 —— tension 与 icing 共用。\n *\n * 统一使用 SI 单位(米),与站点 calc-core.js 的 icingCheck 内部口径一致。\n * 页面侧若以 mm 采集,调用前需自行 /1000。\n */\n\nimport { G0 } from '../types';\n\n/** 冰密度常用值,kg/m³ */\nexport const DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;\n\nexport interface IceLoadParams {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\n/**\n * 冰筒模型单位长度冰重:g_ice = ρ_ice·g₀·π·b·(d + b),N/m。\n *\n * 传 iceThicknessM = 0 时返回 0。\n */\nexport function iceLoadNPerM(params: IceLoadParams): number {\n const { wireDiameterM, iceThicknessM } = params;\n const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;\n\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(iceThicknessM >= 0)) {\n throw new RangeError(`覆冰厚度不能为负,收到 ${iceThicknessM} m`);\n }\n if (!(rho > 0)) {\n throw new RangeError(`冰密度必须为正数,收到 ${rho} kg/m³`);\n }\n if (iceThicknessM === 0) return 0;\n\n return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);\n}\n","export { icingMeta } from './meta';\n\n// 冰筒模型与 tension 模块共用 src/common/ice.ts,由根 index 统一导出\nimport { iceLoadNPerM, type IceLoadParams } from '../common/ice';\n\nexport interface IcingCheckInput {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 线索自重 g_self,N/m */\n readonly selfWeightNPerM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\nexport interface IcingCheckResult {\n /** 单位长度冰重 g_ice,N/m */\n readonly iceLoadNPerM: number;\n /** 覆冰后总垂直荷载 g_total,N/m */\n readonly totalLoadNPerM: number;\n /** 无冰弛度 f₀,m */\n readonly sagNoIceM: number;\n /** 覆冰弛度 f_ice,m */\n readonly sagWithIceM: number;\n /** 弛度增幅,% */\n readonly growthPercent: number;\n /** 冰重是否超过线索自重(重覆冰判据) */\n readonly heavy: boolean;\n}\n\n/**\n * 覆冰综合校核。\n *\n * 给出覆冰后的总垂直荷载、弛度及增幅;冰重超过线索自重时 `heavy` 为真。\n *\n * ⚠️ 弛度按抛物线近似,且**未与张力-温度状态方程耦合** —— 覆冰引起的\n * 张力变化未计入,大覆冰工况偏于乐观。\n */\nexport function icingCheck(input: IcingCheckInput): IcingCheckResult {\n const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(selfWeightNPerM > 0)) {\n throw new RangeError(`线索自重必须为正数,收到 ${selfWeightNPerM} N/m`);\n }\n\n const iceParams: IceLoadParams = {\n wireDiameterM,\n iceThicknessM,\n ...(input.iceDensityKgPerM3 === undefined\n ? {}\n : { iceDensityKgPerM3: input.iceDensityKgPerM3 }),\n };\n const gIce = iceLoadNPerM(iceParams);\n const gTotal = selfWeightNPerM + gIce;\n\n const fNoIce = (selfWeightNPerM * spanM * spanM) / (8 * tensionN);\n const fIce = (gTotal * spanM * spanM) / (8 * tensionN);\n\n return {\n iceLoadNPerM: gIce,\n totalLoadNPerM: gTotal,\n sagNoIceM: fNoIce,\n sagWithIceM: fIce,\n growthPercent: (fIce / fNoIce - 1) * 100,\n heavy: gIce > selfWeightNPerM,\n };\n}\n"],"mappings":";AAEO,IAAM,YAA4B;AAAA,EACvC,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,EACF;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACCO,IAAM,KAAK;;;ACtBX,IAAM,gCAAgC;AAgBtC,SAAS,aAAa,QAA+B;AAC1D,QAAM,EAAE,eAAe,cAAc,IAAI;AACzC,QAAM,MAAM,OAAO,qBAAqB;AAExC,MAAI,EAAE,gBAAgB,IAAI;AACxB,UAAM,IAAI,WAAW,4EAAgB,aAAa,IAAI;AAAA,EACxD;AACA,MAAI,EAAE,iBAAiB,IAAI;AACzB,UAAM,IAAI,WAAW,sEAAe,aAAa,IAAI;AAAA,EACvD;AACA,MAAI,EAAE,MAAM,IAAI;AACd,UAAM,IAAI,WAAW,sEAAe,GAAG,WAAQ;AAAA,EACjD;AACA,MAAI,kBAAkB,EAAG,QAAO;AAEhC,SAAO,MAAM,KAAK,KAAK,KAAK,iBAAiB,gBAAgB;AAC/D;;;ACCO,SAAS,WAAW,OAA0C;AACnE,QAAM,EAAE,eAAe,eAAe,UAAU,OAAO,gBAAgB,IAAI;AAE3E,MAAI,EAAE,WAAW,IAAI;AACnB,UAAM,IAAI,WAAW,gEAAc,QAAQ,IAAI;AAAA,EACjD;AACA,MAAI,EAAE,QAAQ,IAAI;AAChB,UAAM,IAAI,WAAW,gEAAc,KAAK,IAAI;AAAA,EAC9C;AACA,MAAI,EAAE,kBAAkB,IAAI;AAC1B,UAAM,IAAI,WAAW,4EAAgB,eAAe,MAAM;AAAA,EAC5D;AAEA,QAAM,YAA2B;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,GAAI,MAAM,sBAAsB,SAC5B,CAAC,IACD,EAAE,mBAAmB,MAAM,kBAAkB;AAAA,EACnD;AACA,QAAM,OAAO,aAAa,SAAS;AACnC,QAAM,SAAS,kBAAkB;AAEjC,QAAM,SAAU,kBAAkB,QAAQ,SAAU,IAAI;AACxD,QAAM,OAAQ,SAAS,QAAQ,SAAU,IAAI;AAE7C,SAAO;AAAA,IACL,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,aAAa;AAAA,IACb,gBAAgB,OAAO,SAAS,KAAK;AAAA,IACrC,OAAO,OAAO;AAAA,EAChB;AACF;","names":[]}
@@ -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":[]}