ocs-calculators 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +10 -10
  2. package/dist/anchor-length/index.cjs +11 -0
  3. package/dist/anchor-length/index.cjs.map +1 -0
  4. package/dist/anchor-length/index.d.cts +45 -0
  5. package/dist/anchor-length/index.d.ts +45 -0
  6. package/dist/anchor-length/index.js +11 -0
  7. package/dist/anchor-length/index.js.map +1 -0
  8. package/dist/bvalue/index.cjs +9 -0
  9. package/dist/bvalue/index.cjs.map +1 -0
  10. package/dist/bvalue/index.d.cts +35 -0
  11. package/dist/bvalue/index.d.ts +35 -0
  12. package/dist/bvalue/index.js +9 -0
  13. package/dist/bvalue/index.js.map +1 -0
  14. package/dist/cantilever/index.cjs +11 -0
  15. package/dist/cantilever/index.cjs.map +1 -0
  16. package/dist/cantilever/index.d.cts +31 -0
  17. package/dist/cantilever/index.d.ts +31 -0
  18. package/dist/cantilever/index.js +11 -0
  19. package/dist/cantilever/index.js.map +1 -0
  20. package/dist/chunk-3GREMF76.js +44 -0
  21. package/dist/chunk-3GREMF76.js.map +1 -0
  22. package/dist/chunk-4344WWAF.cjs +58 -0
  23. package/dist/chunk-4344WWAF.cjs.map +1 -0
  24. package/dist/chunk-57J7I6JA.cjs +116 -0
  25. package/dist/chunk-57J7I6JA.cjs.map +1 -0
  26. package/dist/chunk-75EGROQB.js +53 -0
  27. package/dist/chunk-75EGROQB.js.map +1 -0
  28. package/dist/chunk-C2XU3XKP.js +46 -0
  29. package/dist/chunk-C2XU3XKP.js.map +1 -0
  30. package/dist/chunk-CLVLOLUJ.js +45 -0
  31. package/dist/chunk-CLVLOLUJ.js.map +1 -0
  32. package/dist/chunk-CSLI5HEJ.cjs +53 -0
  33. package/dist/chunk-CSLI5HEJ.cjs.map +1 -0
  34. package/dist/chunk-D5F5ES2R.js +163 -0
  35. package/dist/chunk-D5F5ES2R.js.map +1 -0
  36. package/dist/chunk-HXALVJ4G.cjs +44 -0
  37. package/dist/chunk-HXALVJ4G.cjs.map +1 -0
  38. package/dist/chunk-HZWNKKIB.js +42 -0
  39. package/dist/chunk-HZWNKKIB.js.map +1 -0
  40. package/dist/chunk-LBGUOTCJ.cjs +45 -0
  41. package/dist/chunk-LBGUOTCJ.cjs.map +1 -0
  42. package/dist/chunk-PYNVEHGR.cjs +46 -0
  43. package/dist/chunk-PYNVEHGR.cjs.map +1 -0
  44. package/dist/chunk-TO46PTS3.js +116 -0
  45. package/dist/chunk-TO46PTS3.js.map +1 -0
  46. package/dist/chunk-VXVTT6WS.js +58 -0
  47. package/dist/chunk-VXVTT6WS.js.map +1 -0
  48. package/dist/chunk-WGTOBRYV.cjs +42 -0
  49. package/dist/chunk-WGTOBRYV.cjs.map +1 -0
  50. package/dist/chunk-X25CXRVE.cjs +163 -0
  51. package/dist/chunk-X25CXRVE.cjs.map +1 -0
  52. package/dist/creepage/index.cjs +15 -0
  53. package/dist/creepage/index.cjs.map +1 -0
  54. package/dist/creepage/index.d.cts +40 -0
  55. package/dist/creepage/index.d.ts +40 -0
  56. package/dist/creepage/index.js +15 -0
  57. package/dist/creepage/index.js.map +1 -0
  58. package/dist/cross-span/index.cjs +9 -0
  59. package/dist/cross-span/index.cjs.map +1 -0
  60. package/dist/cross-span/index.d.cts +68 -0
  61. package/dist/cross-span/index.d.ts +68 -0
  62. package/dist/cross-span/index.js +9 -0
  63. package/dist/cross-span/index.js.map +1 -0
  64. package/dist/index.cjs +77 -9
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +8 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.js +86 -18
  69. package/dist/index.js.map +1 -1
  70. package/dist/pole-capacity/index.cjs +13 -0
  71. package/dist/pole-capacity/index.cjs.map +1 -0
  72. package/dist/pole-capacity/index.d.cts +47 -0
  73. package/dist/pole-capacity/index.d.ts +47 -0
  74. package/dist/pole-capacity/index.js +13 -0
  75. package/dist/pole-capacity/index.js.map +1 -0
  76. package/dist/sag/index.cjs +13 -0
  77. package/dist/sag/index.cjs.map +1 -0
  78. package/dist/sag/index.d.cts +21 -0
  79. package/dist/sag/index.d.ts +21 -0
  80. package/dist/sag/index.js +13 -0
  81. package/dist/sag/index.js.map +1 -0
  82. package/dist/steady-arm/index.cjs +11 -0
  83. package/dist/steady-arm/index.cjs.map +1 -0
  84. package/dist/steady-arm/index.d.cts +66 -0
  85. package/dist/steady-arm/index.d.ts +66 -0
  86. package/dist/steady-arm/index.js +11 -0
  87. package/dist/steady-arm/index.js.map +1 -0
  88. package/package.json +43 -3
@@ -0,0 +1,53 @@
1
+ // src/anchor-length/meta.ts
2
+ var anchorLengthMeta = {
3
+ name: "\u951A\u6BB5\u957F\u5EA6\u5F20\u529B\u5DEE\u6821\u6838",
4
+ nameEn: "Anchor Span Tension Difference Check",
5
+ summary: "\u8BA1\u7B97\u63A5\u89E6\u7EBF\u5F20\u529B\u589E\u91CF\uFF08\u66F2\u7EBF\u5B9A\u4F4D\u5668\u9879\u3001\u76F4\u7EBF\u540A\u5F26\u9879\uFF0C\u6559\u6750\u53E3\u5F84\uFF09\u5E76\u6309\u5F20\u529B\u5DEE\u5224\u636E\u6821\u6838\u3002",
6
+ formula: [
7
+ "\u66F2\u7EBF\u5B9A\u4F4D\u5668\u9879\uFF1AT_jw = d\xB7T_jm/R",
8
+ "\u76F4\u7EBF\u540A\u5F26\u9879\uFF1AT_jd = L(L\u2212l)\xB7g_j\xB7\u03B1\xB7\u0394t/(2c)",
9
+ "\u5224\u636E\uFF1A\u0394T \u2264 10%\xB7T_N\uFF08TB 10009-2016 \u7B2C 5.4.7 \u6761\uFF09"
10
+ ],
11
+ references: [
12
+ "\u5224\u636E\uFF1A\u63A5\u89E6\u7EBF\u3001\u627F\u529B\u7D22\u5F20\u529B\u5DEE\u5747\u4E0D\u5F97\u5927\u4E8E\u989D\u5B9A\u5F20\u529B 10%\uFF08TB 10009-2016 5.4.7\uFF09",
13
+ "\u6559\u6750\u53E3\u5F84\uFF08\u4E8E\u4E07\u805A\u300A\u7535\u6C14\u5316\u94C1\u9053\u63A5\u89E6\u7F51\u8BBE\u8BA1\u300B\u4F53\u7CFB\uFF09",
14
+ "\u76F4\u7EBF\u540A\u5F26\u9879\u91CF\u7EB2\uFF1Am\xB2\xB7kN/m\xB7(1/\u2103)\xB7\u2103/m = kN\uFF0C2026-09-13 \u590D\u6838\u81EA\u6D3D"
15
+ ],
16
+ scope: ["\u66F2\u7EBF\u534A\u5F84 R\uFF1A100~4000 m", "\u5B9A\u4F4D\u5668\u957F d\uFF1A0.5~2.5 m", "\u534A\u951A\u6BB5 L\uFF1A100~2000 m", "\u8DE8\u8DDD l\uFF1A30~90 m"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/anchor-length/"
19
+ };
20
+
21
+ // src/anchor-length/index.ts
22
+ var TENSION_DIFF_RATIO = 0.1;
23
+ function anchorLengthCheck(input) {
24
+ const { section, ratedTensionKN } = input;
25
+ if (!(ratedTensionKN > 0)) throw new RangeError("\u989D\u5B9A\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + ratedTensionKN + " kN");
26
+ let deltaN;
27
+ if (section === "curve") {
28
+ const { curveRadiusM, regulatorLengthM, regulatorCount } = input;
29
+ if (!(curveRadiusM && curveRadiusM > 0)) throw new RangeError("\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63");
30
+ if (!(regulatorLengthM && regulatorLengthM > 0)) throw new RangeError("\u5B9A\u4F4D\u5668\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
31
+ const n = regulatorCount ?? 1;
32
+ const one = regulatorLengthM * ratedTensionKN * 1e3 / curveRadiusM;
33
+ deltaN = one * n;
34
+ } else {
35
+ const { halfSpanM, spanM, dropperLengthM, wireWeightKNPerM, expansionCoeff, tempDeltaC } = input;
36
+ if (!(halfSpanM && halfSpanM > 0)) throw new RangeError("\u534A\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
37
+ if (!(spanM && spanM > 0)) throw new RangeError("\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63");
38
+ if (!(dropperLengthM && dropperLengthM > 0)) throw new RangeError("\u540A\u5F26\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
39
+ if (wireWeightKNPerM === void 0 || expansionCoeff === void 0 || tempDeltaC === void 0) {
40
+ throw new RangeError("\u76F4\u7EBF\u533A\u6BB5\u9700\u63D0\u4F9B g_j\u3001\u03B1\u3001\u0394t");
41
+ }
42
+ deltaN = halfSpanM * (halfSpanM - spanM) * wireWeightKNPerM * expansionCoeff * tempDeltaC / (2 * dropperLengthM) * 1e3;
43
+ }
44
+ const limitN = TENSION_DIFF_RATIO * ratedTensionKN * 1e3;
45
+ return { deltaN, limitN, ratio: deltaN / limitN, passes: deltaN <= limitN };
46
+ }
47
+
48
+ export {
49
+ anchorLengthMeta,
50
+ TENSION_DIFF_RATIO,
51
+ anchorLengthCheck
52
+ };
53
+ //# sourceMappingURL=chunk-75EGROQB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/anchor-length/meta.ts","../src/anchor-length/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const anchorLengthMeta: CalculatorMeta = {\n name: '锚段长度张力差校核',\n nameEn: 'Anchor Span Tension Difference Check',\n summary: '计算接触线张力增量(曲线定位器项、直线吊弦项,教材口径)并按张力差判据校核。',\n formula: [\n '曲线定位器项:T_jw = d·T_jm/R',\n '直线吊弦项:T_jd = L(L−l)·g_j·α·Δt/(2c)',\n '判据:ΔT ≤ 10%·T_N(TB 10009-2016 第 5.4.7 条)',\n ],\n references: [\n '判据:接触线、承力索张力差均不得大于额定张力 10%(TB 10009-2016 5.4.7)',\n '教材口径(于万聚《电气化铁道接触网设计》体系)',\n '直线吊弦项量纲:m²·kN/m·(1/℃)·℃/m = kN,2026-09-13 复核自洽',\n ],\n scope: ['曲线半径 R:100~4000 m', '定位器长 d:0.5~2.5 m', '半锚段 L:100~2000 m', '跨距 l:30~90 m'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/anchor-length/',\n};\n","export { anchorLengthMeta } from './meta';\n\n/** 张力增量判据(TB 10009-2016 第 5.4.7 条) */\nexport const TENSION_DIFF_RATIO = 0.10;\n\n/** 锚段张力增量计算参数(教材口径,直线吊弦项量纲已复核)。单位:m、kN、1/℃、℃。 */\nexport interface AnchorLengthInput {\n /** 区段类型:'line' 直线 | 'curve' 曲线 */\n readonly section: 'line' | 'curve';\n /** 接触线额定张力 T_N,kN(判据基准) */\n readonly ratedTensionKN: number;\n /** 半锚段长度 L(中心锚结至补偿器),m */\n readonly halfSpanM?: number;\n /** 曲线半径 R,m(曲线区段) */\n readonly curveRadiusM?: number;\n /** 定位器长度 d,m(曲线区段) */\n readonly regulatorLengthM?: number;\n /** 定位器数量 n(曲线区段) */\n readonly regulatorCount?: number;\n /** 跨距 l,m(直线吊弦项) */\n readonly spanM?: number;\n /** 吊弦平均长度 c,m(直线吊弦项) */\n readonly dropperLengthM?: number;\n /** 接触线单位重 g_j,kN/m(直线吊弦项) */\n readonly wireWeightKNPerM?: number;\n /** 线胀系数 α,1/℃(直线吊弦项) */\n readonly expansionCoeff?: number;\n /** 计算温差 Δt,℃(直线吊弦项) */\n readonly tempDeltaC?: number;\n}\n\nexport interface AnchorLengthResult {\n /** 张力增量,N */\n readonly deltaN: number;\n /** 判据限值 10%·T_N,N */\n readonly limitN: number;\n /** 张力差占额定张力比例 */\n readonly ratio: number;\n /** 是否合格(ΔT ≤ 10%·T_N) */\n readonly passes: boolean;\n}\n\n/** 锚段张力增量(教材口径)与 10% 判据校核 */\nexport function anchorLengthCheck(input: AnchorLengthInput): AnchorLengthResult {\n const { section, ratedTensionKN } = input;\n if (!(ratedTensionKN > 0)) throw new RangeError('额定张力必须为正,收到 ' + ratedTensionKN + ' kN');\n let deltaN: number;\n if (section === 'curve') {\n const { curveRadiusM, regulatorLengthM, regulatorCount } = input;\n if (!(curveRadiusM && curveRadiusM > 0)) throw new RangeError('曲线半径必须为正');\n if (!(regulatorLengthM && regulatorLengthM > 0)) throw new RangeError('定位器长度必须为正');\n const n = regulatorCount ?? 1;\n const one = (regulatorLengthM * ratedTensionKN * 1e3) / curveRadiusM; // T_jw = d·T_jm/R\n deltaN = one * n;\n } else {\n const { halfSpanM, spanM, dropperLengthM, wireWeightKNPerM, expansionCoeff, tempDeltaC } = input;\n if (!(halfSpanM && halfSpanM > 0)) throw new RangeError('半锚段长度必须为正');\n if (!(spanM && spanM > 0)) throw new RangeError('跨距必须为正');\n if (!(dropperLengthM && dropperLengthM > 0)) throw new RangeError('吊弦长度必须为正');\n if (wireWeightKNPerM === undefined || expansionCoeff === undefined || tempDeltaC === undefined) {\n throw new RangeError('直线区段需提供 g_j、α、Δt');\n }\n // T_jd = L(L−l)·g_j·α·Δt/(2c),kN → N\n deltaN = (halfSpanM * (halfSpanM - spanM) * wireWeightKNPerM * expansionCoeff * tempDeltaC) / (2 * dropperLengthM) * 1e3;\n }\n const limitN = TENSION_DIFF_RATIO * ratedTensionKN * 1e3;\n return { deltaN, limitN, ratio: deltaN / limitN, passes: deltaN <= limitN };\n}\n"],"mappings":";AAEO,IAAM,mBAAmC;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO,CAAC,8CAAqB,6CAAoB,wCAAoB,6BAAc;AAAA,EACnF,YAAY;AAAA,EACZ,QAAQ;AACV;;;AChBO,IAAM,qBAAqB;AAwC3B,SAAS,kBAAkB,OAA8C;AAC9E,QAAM,EAAE,SAAS,eAAe,IAAI;AACpC,MAAI,EAAE,iBAAiB,GAAI,OAAM,IAAI,WAAW,wEAAiB,iBAAiB,KAAK;AACvF,MAAI;AACJ,MAAI,YAAY,SAAS;AACvB,UAAM,EAAE,cAAc,kBAAkB,eAAe,IAAI;AAC3D,QAAI,EAAE,gBAAgB,eAAe,GAAI,OAAM,IAAI,WAAW,kDAAU;AACxE,QAAI,EAAE,oBAAoB,mBAAmB,GAAI,OAAM,IAAI,WAAW,wDAAW;AACjF,UAAM,IAAI,kBAAkB;AAC5B,UAAM,MAAO,mBAAmB,iBAAiB,MAAO;AACxD,aAAS,MAAM;AAAA,EACjB,OAAO;AACL,UAAM,EAAE,WAAW,OAAO,gBAAgB,kBAAkB,gBAAgB,WAAW,IAAI;AAC3F,QAAI,EAAE,aAAa,YAAY,GAAI,OAAM,IAAI,WAAW,wDAAW;AACnE,QAAI,EAAE,SAAS,QAAQ,GAAI,OAAM,IAAI,WAAW,sCAAQ;AACxD,QAAI,EAAE,kBAAkB,iBAAiB,GAAI,OAAM,IAAI,WAAW,kDAAU;AAC5E,QAAI,qBAAqB,UAAa,mBAAmB,UAAa,eAAe,QAAW;AAC9F,YAAM,IAAI,WAAW,yEAAkB;AAAA,IACzC;AAEA,aAAU,aAAa,YAAY,SAAS,mBAAmB,iBAAiB,cAAe,IAAI,kBAAkB;AAAA,EACvH;AACA,QAAM,SAAS,qBAAqB,iBAAiB;AACrD,SAAO,EAAE,QAAQ,QAAQ,OAAO,SAAS,QAAQ,QAAQ,UAAU,OAAO;AAC5E;","names":[]}
@@ -0,0 +1,46 @@
1
+ // src/sag/meta.ts
2
+ var sagMeta = {
3
+ name: "\u5F1B\u5EA6\u901F\u7B97\uFF08\u5F1B\u5EA6-\u5F20\u529B\u4E92\u7B97\uFF09",
4
+ nameEn: "Sag Quick Calculation",
5
+ summary: "\u7B49\u9AD8\u60AC\u6302\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF08\u5C0F\u5F1B\u5EA6\u5047\u8BBE\uFF09\u4E0B\u5F1B\u5EA6\u3001\u5F20\u529B\u4E0E\u6700\u5927\u8DE8\u8DDD\u4E92\u7B97\u3002",
6
+ formula: [
7
+ "\u5F1B\u5EA6 f = g\xB7l\xB2/(8T)",
8
+ "\u53CD\u7B97\u5F20\u529B T = g\xB7l\xB2/(8\xB7f)",
9
+ "\u53CD\u7B97\u8DE8\u8DDD\u4E0A\u9650 l_max = \u221A(8\xB7T\xB7f_max/g)"
10
+ ],
11
+ references: [
12
+ "\u9650\u503C\uFF08TB 10009-2016 \u7B2C 5.1.9 \u6761\uFF0C\u63A8\u8350\u6027\u300C\u4E0D\u5B9C\u5927\u4E8E\u300D\u53E3\u5F84\uFF09\uFF1A\u94FE\u5F62\u60AC\u6302\u63A5\u89E6\u7EBF 150 mm\u3001\u7B80\u5355\u60AC\u6302 250 mm\u3001\u4F4E\u901F\u533A\u6BB5 350 mm",
13
+ "\u7B49\u9AD8\u60AC\u6302\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E f/l \u2264 1/10"
14
+ ],
15
+ scope: ["\u5F20\u529B T\uFF1A1~40 kN", "\u8DE8\u8DDD l\uFF1A5~80 m", "\u5355\u4F4D\u91CD g\uFF1A5~25 N/m"],
16
+ 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",
17
+ online: "https://www.itswe.com/calculator/sag/"
18
+ };
19
+
20
+ // src/sag/index.ts
21
+ function sagMM(input) {
22
+ const { tensionKN, spanM, weightNPerM } = input;
23
+ if (!(tensionKN > 0)) throw new RangeError("\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + tensionKN + " kN");
24
+ if (!(spanM > 0)) throw new RangeError("\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + spanM + " m");
25
+ if (!(weightNPerM >= 0)) throw new RangeError("\u5355\u4F4D\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 " + weightNPerM + " N/m");
26
+ const sagM = weightNPerM * spanM * spanM / (8 * tensionKN * 1e3);
27
+ return sagM * 1e3;
28
+ }
29
+ function tensionFromSagKN(weightNPerM, spanM, sagMM2) {
30
+ if (!(sagMM2 > 0)) throw new RangeError("\u5F1B\u5EA6\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + sagMM2 + " mm");
31
+ const sagM = sagMM2 / 1e3;
32
+ return weightNPerM * spanM * spanM / (8 * sagM) / 1e3;
33
+ }
34
+ function maxSpanFromSagM(weightNPerM, tensionKN, sagLimitMM) {
35
+ if (!(sagLimitMM > 0)) throw new RangeError("\u9650\u503C\u5F1B\u5EA6\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + sagLimitMM + " mm");
36
+ const sagM = sagLimitMM / 1e3;
37
+ return Math.sqrt(8 * tensionKN * 1e3 * sagM / weightNPerM);
38
+ }
39
+
40
+ export {
41
+ sagMeta,
42
+ sagMM,
43
+ tensionFromSagKN,
44
+ maxSpanFromSagM
45
+ };
46
+ //# sourceMappingURL=chunk-C2XU3XKP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sag/meta.ts","../src/sag/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const sagMeta: CalculatorMeta = {\n name: '弛度速算(弛度-张力互算)',\n nameEn: 'Sag Quick Calculation',\n summary: '等高悬挂抛物线近似(小弛度假设)下弛度、张力与最大跨距互算。',\n formula: [\n '弛度 f = g·l²/(8T)',\n '反算张力 T = g·l²/(8·f)',\n '反算跨距上限 l_max = √(8·T·f_max/g)',\n ],\n references: [\n '限值(TB 10009-2016 第 5.1.9 条,推荐性「不宜大于」口径):链形悬挂接触线 150 mm、简单悬挂 250 mm、低速区段 350 mm',\n '等高悬挂抛物线近似,适用于 f/l ≤ 1/10',\n ],\n scope: ['张力 T:1~40 kN', '跨距 l:5~80 m', '单位重 g:5~25 N/m'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/sag/',\n};\n","export { sagMeta } from './meta';\n\n/** 弛度计算参数。单位:张力 kN、跨距 m、单位重 N/m。 */\nexport interface SagInput {\n /** 接触线/承力索张力 T,kN */\n readonly tensionKN: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 单位长度重量 g,N/m */\n readonly weightNPerM: number;\n}\n\n/** 弛度 f = g·l²/(8T),mm */\nexport function sagMM(input: SagInput): number {\n const { tensionKN, spanM, weightNPerM } = input;\n if (!(tensionKN > 0)) throw new RangeError('张力必须为正,收到 ' + tensionKN + ' kN');\n if (!(spanM > 0)) throw new RangeError('跨距必须为正,收到 ' + spanM + ' m');\n if (!(weightNPerM >= 0)) throw new RangeError('单位重不能为负,收到 ' + weightNPerM + ' N/m');\n const sagM = (weightNPerM * spanM * spanM) / (8 * tensionKN * 1e3);\n return sagM * 1e3;\n}\n\n/** 反算张力:给定弛度求张力 T = g·l²/(8·f),kN */\nexport function tensionFromSagKN(weightNPerM: number, spanM: number, sagMM: number): number {\n if (!(sagMM > 0)) throw new RangeError('弛度必须为正,收到 ' + sagMM + ' mm');\n const sagM = sagMM / 1e3;\n return (weightNPerM * spanM * spanM) / (8 * sagM) / 1e3;\n}\n\n/** 反算最大跨距:给定张力与限值弛度 l_max = √(8·T·f_max/g),m */\nexport function maxSpanFromSagM(weightNPerM: number, tensionKN: number, sagLimitMM: number): number {\n if (!(sagLimitMM > 0)) throw new RangeError('限值弛度必须为正,收到 ' + sagLimitMM + ' mm');\n const sagM = sagLimitMM / 1e3;\n return Math.sqrt((8 * tensionKN * 1e3 * sagM) / weightNPerM);\n}\n"],"mappings":";AAEO,IAAM,UAA0B;AAAA,EACrC,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,EACF;AAAA,EACA,OAAO,CAAC,+BAAgB,8BAAe,oCAAgB;AAAA,EACvD,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACLO,SAAS,MAAM,OAAyB;AAC7C,QAAM,EAAE,WAAW,OAAO,YAAY,IAAI;AAC1C,MAAI,EAAE,YAAY,GAAI,OAAM,IAAI,WAAW,4DAAe,YAAY,KAAK;AAC3E,MAAI,EAAE,QAAQ,GAAI,OAAM,IAAI,WAAW,4DAAe,QAAQ,IAAI;AAClE,MAAI,EAAE,eAAe,GAAI,OAAM,IAAI,WAAW,kEAAgB,cAAc,MAAM;AAClF,QAAM,OAAQ,cAAc,QAAQ,SAAU,IAAI,YAAY;AAC9D,SAAO,OAAO;AAChB;AAGO,SAAS,iBAAiB,aAAqB,OAAeA,QAAuB;AAC1F,MAAI,EAAEA,SAAQ,GAAI,OAAM,IAAI,WAAW,4DAAeA,SAAQ,KAAK;AACnE,QAAM,OAAOA,SAAQ;AACrB,SAAQ,cAAc,QAAQ,SAAU,IAAI,QAAQ;AACtD;AAGO,SAAS,gBAAgB,aAAqB,WAAmB,YAA4B;AAClG,MAAI,EAAE,aAAa,GAAI,OAAM,IAAI,WAAW,wEAAiB,aAAa,KAAK;AAC/E,QAAM,OAAO,aAAa;AAC1B,SAAO,KAAK,KAAM,IAAI,YAAY,MAAM,OAAQ,WAAW;AAC7D;","names":["sagMM"]}
@@ -0,0 +1,45 @@
1
+ // src/creepage/meta.ts
2
+ var creepageMeta = {
3
+ name: "\u7EDD\u7F18\u5B50\u722C\u7535\u8DDD\u79BB\u9009\u578B\u6821\u6838",
4
+ nameEn: "Insulator Creepage Distance Check",
5
+ summary: "\u6309 TB 10009-2016 \u7B2C 5.3.2 \u6761\u5E95\u7EBF\u5224\u5B9A\u63A5\u89E6\u7F51\u7EDD\u7F18\u6700\u5C0F\u722C\u7535\u8DDD\u79BB\uFF0C\u9644 GB/T 32586 \u6BD4\u8DDD\u4E09\u6863\u5BF9\u7167\u3002",
6
+ formula: [
7
+ "\u5E95\u7EBF\uFF1A\u4E00\u822C\u533A\u6BB5 \u22651400 mm\uFF1BV \u5F62\u5929\u7A97\u4E0A\u3001\u4E0B\u884C\u6B63\u7EBF\u95F4\u5206\u6BB5\u4E32 \u22651600 mm",
8
+ "GB/T 32586 \u7EDF\u4E00\u722C\u7535\u6BD4\u8DDD\u4E09\u6863\uFF1A\u6B63\u5E38 24~33\u3001\u975E\u6B63\u5E38 36~40\u3001\u82DB\u523B >48 mm/kV"
9
+ ],
10
+ references: [
11
+ "TB 10009-2016 \u7B2C 5.3.2 \u6761\u7B2C 1 \u6B3E\uFF08\u7EDD\u5BF9\u5E95\u7EBF\uFF09",
12
+ "GB/T 32586-2016 \u7B2C 4.4 \u6761\uFF08\u7EDF\u4E00\u722C\u7535\u6BD4\u8DDD\u4E09\u6863\uFF0C\u6309\u7CFB\u7EDF\u6700\u9AD8\u6301\u7EED\u7535\u538B\u6298\u7B97\uFF09",
13
+ "\u94C1\u8DEF\u4F53\u7CFB\u4EE5\u7EDD\u5BF9\u503C\u95E8\u69DB\u5224\u5B9A\uFF0C\u6BD4\u8DDD\u6CD5\u4EC5\u4F5C\u5BF9\u7167"
14
+ ],
15
+ scope: ["\u722C\u7535\u8DDD\u79BB\uFF1A600~2500 mm", "\u7CFB\u7EDF\u6700\u9AD8\u7535\u538B\uFF1A27.5~31 kV"],
16
+ 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",
17
+ online: "https://www.itswe.com/calculator/creepage/"
18
+ };
19
+
20
+ // src/creepage/index.ts
21
+ var CREEPAGE_FLOOR_GENERAL = 1400;
22
+ var CREEPAGE_FLOOR_VCUT = 1600;
23
+ var USCD_BANDS = [
24
+ { label: "\u6B63\u5E38", min: 24, max: 33 },
25
+ { label: "\u975E\u6B63\u5E38", min: 36, max: 40 },
26
+ { label: "\u82DB\u523B", min: 48, max: Infinity }
27
+ ];
28
+ function creepageCheck(input) {
29
+ const floorMM = input.scenario === "vcut" ? CREEPAGE_FLOOR_VCUT : CREEPAGE_FLOOR_GENERAL;
30
+ const kv = input.maxVoltageKV ?? 29;
31
+ const uscdBands = USCD_BANDS.map((b) => ({
32
+ label: b.label,
33
+ mm: b.max === Infinity ? Math.round(b.min * kv) : Math.round(b.min * kv)
34
+ }));
35
+ return { floorMM, passes: input.creepageMM >= floorMM, uscdBands };
36
+ }
37
+
38
+ export {
39
+ creepageMeta,
40
+ CREEPAGE_FLOOR_GENERAL,
41
+ CREEPAGE_FLOOR_VCUT,
42
+ USCD_BANDS,
43
+ creepageCheck
44
+ };
45
+ //# sourceMappingURL=chunk-CLVLOLUJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/creepage/meta.ts","../src/creepage/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const creepageMeta: CalculatorMeta = {\n name: '绝缘子爬电距离选型校核',\n nameEn: 'Insulator Creepage Distance Check',\n summary: '按 TB 10009-2016 第 5.3.2 条底线判定接触网绝缘最小爬电距离,附 GB/T 32586 比距三档对照。',\n formula: [\n '底线:一般区段 ≥1400 mm;V 形天窗上、下行正线间分段串 ≥1600 mm',\n 'GB/T 32586 统一爬电比距三档:正常 24~33、非正常 36~40、苛刻 >48 mm/kV',\n ],\n references: [\n 'TB 10009-2016 第 5.3.2 条第 1 款(绝对底线)',\n 'GB/T 32586-2016 第 4.4 条(统一爬电比距三档,按系统最高持续电压折算)',\n '铁路体系以绝对值门槛判定,比距法仅作对照',\n ],\n scope: ['爬电距离:600~2500 mm', '系统最高电压:27.5~31 kV'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/creepage/',\n};\n","export { creepageMeta } from './meta';\n\n/** 接触网绝缘爬电距离底线(TB 10009-2016 第 5.3.2 条第 1 款),mm */\nexport const CREEPAGE_FLOOR_GENERAL = 1400;\n/** V 形天窗区段上、下行正线间分段绝缘子串底线,mm */\nexport const CREEPAGE_FLOOR_VCUT = 1600;\n\n/** GB/T 32586 统一爬电比距三档(第 4.4 条,按系统最高持续电压折算) */\nexport const USCD_BANDS = [\n { label: '正常', min: 24, max: 33 },\n { label: '非正常', min: 36, max: 40 },\n { label: '苛刻', min: 48, max: Infinity },\n] as const;\n\n/** 爬电距离校核 */\nexport function creepageCheck(input: {\n /** 绝缘子实际爬电距离,mm */\n readonly creepageMM: number;\n /** 使用场景:'general' 一般 | 'vcut' V 形天窗分段串 */\n readonly scenario?: 'general' | 'vcut';\n /** 系统最高电压,kV(GB/T 32586 折算用,默认 29) */\n readonly maxVoltageKV?: number;\n}): {\n floorMM: number; passes: boolean; uscdBands: { label: string; mm: number }[];\n} {\n const floorMM = (input.scenario === 'vcut' ? CREEPAGE_FLOOR_VCUT : CREEPAGE_FLOOR_GENERAL);\n const kv = input.maxVoltageKV ?? 29;\n const uscdBands = USCD_BANDS.map((b) => ({\n label: b.label,\n mm: b.max === Infinity ? Math.round(b.min * kv) : Math.round(b.min * kv),\n }));\n return { floorMM, passes: input.creepageMM >= floorMM, uscdBands };\n}\n"],"mappings":";AAEO,IAAM,eAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO,CAAC,6CAAoB,sDAAmB;AAAA,EAC/C,YAAY;AAAA,EACZ,QAAQ;AACV;;;ACfO,IAAM,yBAAyB;AAE/B,IAAM,sBAAsB;AAG5B,IAAM,aAAa;AAAA,EACxB,EAAE,OAAO,gBAAM,KAAK,IAAI,KAAK,GAAG;AAAA,EAChC,EAAE,OAAO,sBAAO,KAAK,IAAI,KAAK,GAAG;AAAA,EACjC,EAAE,OAAO,gBAAM,KAAK,IAAI,KAAK,SAAS;AACxC;AAGO,SAAS,cAAc,OAS5B;AACA,QAAM,UAAW,MAAM,aAAa,SAAS,sBAAsB;AACnE,QAAM,KAAK,MAAM,gBAAgB;AACjC,QAAM,YAAY,WAAW,IAAI,CAAC,OAAO;AAAA,IACvC,OAAO,EAAE;AAAA,IACT,IAAI,EAAE,QAAQ,WAAW,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,MAAM,EAAE;AAAA,EACzE,EAAE;AACF,SAAO,EAAE,SAAS,QAAQ,MAAM,cAAc,SAAS,UAAU;AACnE;","names":[]}
@@ -0,0 +1,53 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/anchor-length/meta.ts
2
+ var anchorLengthMeta = {
3
+ name: "\u951A\u6BB5\u957F\u5EA6\u5F20\u529B\u5DEE\u6821\u6838",
4
+ nameEn: "Anchor Span Tension Difference Check",
5
+ summary: "\u8BA1\u7B97\u63A5\u89E6\u7EBF\u5F20\u529B\u589E\u91CF\uFF08\u66F2\u7EBF\u5B9A\u4F4D\u5668\u9879\u3001\u76F4\u7EBF\u540A\u5F26\u9879\uFF0C\u6559\u6750\u53E3\u5F84\uFF09\u5E76\u6309\u5F20\u529B\u5DEE\u5224\u636E\u6821\u6838\u3002",
6
+ formula: [
7
+ "\u66F2\u7EBF\u5B9A\u4F4D\u5668\u9879\uFF1AT_jw = d\xB7T_jm/R",
8
+ "\u76F4\u7EBF\u540A\u5F26\u9879\uFF1AT_jd = L(L\u2212l)\xB7g_j\xB7\u03B1\xB7\u0394t/(2c)",
9
+ "\u5224\u636E\uFF1A\u0394T \u2264 10%\xB7T_N\uFF08TB 10009-2016 \u7B2C 5.4.7 \u6761\uFF09"
10
+ ],
11
+ references: [
12
+ "\u5224\u636E\uFF1A\u63A5\u89E6\u7EBF\u3001\u627F\u529B\u7D22\u5F20\u529B\u5DEE\u5747\u4E0D\u5F97\u5927\u4E8E\u989D\u5B9A\u5F20\u529B 10%\uFF08TB 10009-2016 5.4.7\uFF09",
13
+ "\u6559\u6750\u53E3\u5F84\uFF08\u4E8E\u4E07\u805A\u300A\u7535\u6C14\u5316\u94C1\u9053\u63A5\u89E6\u7F51\u8BBE\u8BA1\u300B\u4F53\u7CFB\uFF09",
14
+ "\u76F4\u7EBF\u540A\u5F26\u9879\u91CF\u7EB2\uFF1Am\xB2\xB7kN/m\xB7(1/\u2103)\xB7\u2103/m = kN\uFF0C2026-09-13 \u590D\u6838\u81EA\u6D3D"
15
+ ],
16
+ scope: ["\u66F2\u7EBF\u534A\u5F84 R\uFF1A100~4000 m", "\u5B9A\u4F4D\u5668\u957F d\uFF1A0.5~2.5 m", "\u534A\u951A\u6BB5 L\uFF1A100~2000 m", "\u8DE8\u8DDD l\uFF1A30~90 m"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/anchor-length/"
19
+ };
20
+
21
+ // src/anchor-length/index.ts
22
+ var TENSION_DIFF_RATIO = 0.1;
23
+ function anchorLengthCheck(input) {
24
+ const { section, ratedTensionKN } = input;
25
+ if (!(ratedTensionKN > 0)) throw new RangeError("\u989D\u5B9A\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + ratedTensionKN + " kN");
26
+ let deltaN;
27
+ if (section === "curve") {
28
+ const { curveRadiusM, regulatorLengthM, regulatorCount } = input;
29
+ if (!(curveRadiusM && curveRadiusM > 0)) throw new RangeError("\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63");
30
+ if (!(regulatorLengthM && regulatorLengthM > 0)) throw new RangeError("\u5B9A\u4F4D\u5668\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
31
+ const n = _nullishCoalesce(regulatorCount, () => ( 1));
32
+ const one = regulatorLengthM * ratedTensionKN * 1e3 / curveRadiusM;
33
+ deltaN = one * n;
34
+ } else {
35
+ const { halfSpanM, spanM, dropperLengthM, wireWeightKNPerM, expansionCoeff, tempDeltaC } = input;
36
+ if (!(halfSpanM && halfSpanM > 0)) throw new RangeError("\u534A\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
37
+ if (!(spanM && spanM > 0)) throw new RangeError("\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63");
38
+ if (!(dropperLengthM && dropperLengthM > 0)) throw new RangeError("\u540A\u5F26\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63");
39
+ if (wireWeightKNPerM === void 0 || expansionCoeff === void 0 || tempDeltaC === void 0) {
40
+ throw new RangeError("\u76F4\u7EBF\u533A\u6BB5\u9700\u63D0\u4F9B g_j\u3001\u03B1\u3001\u0394t");
41
+ }
42
+ deltaN = halfSpanM * (halfSpanM - spanM) * wireWeightKNPerM * expansionCoeff * tempDeltaC / (2 * dropperLengthM) * 1e3;
43
+ }
44
+ const limitN = TENSION_DIFF_RATIO * ratedTensionKN * 1e3;
45
+ return { deltaN, limitN, ratio: deltaN / limitN, passes: deltaN <= limitN };
46
+ }
47
+
48
+
49
+
50
+
51
+
52
+ exports.anchorLengthMeta = anchorLengthMeta; exports.TENSION_DIFF_RATIO = TENSION_DIFF_RATIO; exports.anchorLengthCheck = anchorLengthCheck;
53
+ //# sourceMappingURL=chunk-CSLI5HEJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-CSLI5HEJ.cjs","../src/anchor-length/meta.ts","../src/anchor-length/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,iBAAA,EAAmC;AAAA,EAC9C,IAAA,EAAM,wDAAA;AAAA,EACN,MAAA,EAAQ,sCAAA;AAAA,EACR,OAAA,EAAS,sOAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,8DAAA;AAAA,IACA,yFAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,yKAAA;AAAA,IACA,4IAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,4CAAA,EAAqB,2CAAA,EAAoB,sCAAA,EAAoB,6BAAc,CAAA;AAAA,EACnF,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AEjBO,IAAM,mBAAA,EAAqB,GAAA;AAwC3B,SAAS,iBAAA,CAAkB,KAAA,EAA8C;AAC9E,EAAA,MAAM,EAAE,OAAA,EAAS,eAAe,EAAA,EAAI,KAAA;AACpC,EAAA,GAAA,CAAI,CAAA,CAAE,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,sEAAA,EAAiB,eAAA,EAAiB,KAAK,CAAA;AACvF,EAAA,IAAI,MAAA;AACJ,EAAA,GAAA,CAAI,QAAA,IAAY,OAAA,EAAS;AACvB,IAAA,MAAM,EAAE,YAAA,EAAc,gBAAA,EAAkB,eAAe,EAAA,EAAI,KAAA;AAC3D,IAAA,GAAA,CAAI,CAAA,CAAE,aAAA,GAAgB,aAAA,EAAe,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,kDAAU,CAAA;AACxE,IAAA,GAAA,CAAI,CAAA,CAAE,iBAAA,GAAoB,iBAAA,EAAmB,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,wDAAW,CAAA;AACjF,IAAA,MAAM,EAAA,mBAAI,cAAA,UAAkB,GAAA;AAC5B,IAAA,MAAM,IAAA,EAAO,iBAAA,EAAmB,eAAA,EAAiB,IAAA,EAAO,YAAA;AACxD,IAAA,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACjB,EAAA,KAAO;AACL,IAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,cAAA,EAAgB,gBAAA,EAAkB,cAAA,EAAgB,WAAW,EAAA,EAAI,KAAA;AAC3F,IAAA,GAAA,CAAI,CAAA,CAAE,UAAA,GAAa,UAAA,EAAY,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,wDAAW,CAAA;AACnE,IAAA,GAAA,CAAI,CAAA,CAAE,MAAA,GAAS,MAAA,EAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,sCAAQ,CAAA;AACxD,IAAA,GAAA,CAAI,CAAA,CAAE,eAAA,GAAkB,eAAA,EAAiB,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,kDAAU,CAAA;AAC5E,IAAA,GAAA,CAAI,iBAAA,IAAqB,KAAA,EAAA,GAAa,eAAA,IAAmB,KAAA,EAAA,GAAa,WAAA,IAAe,KAAA,CAAA,EAAW;AAC9F,MAAA,MAAM,IAAI,UAAA,CAAW,yEAAkB,CAAA;AAAA,IACzC;AAEA,IAAA,OAAA,EAAU,UAAA,EAAA,CAAa,UAAA,EAAY,KAAA,EAAA,EAAS,iBAAA,EAAmB,eAAA,EAAiB,WAAA,EAAA,CAAe,EAAA,EAAI,cAAA,EAAA,EAAkB,GAAA;AAAA,EACvH;AACA,EAAA,MAAM,OAAA,EAAS,mBAAA,EAAqB,eAAA,EAAiB,GAAA;AACrD,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,GAAU,OAAO,CAAA;AAC5E;AFrBA;AACA;AACE;AACA;AACA;AACF,4IAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-CSLI5HEJ.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const anchorLengthMeta: CalculatorMeta = {\n name: '锚段长度张力差校核',\n nameEn: 'Anchor Span Tension Difference Check',\n summary: '计算接触线张力增量(曲线定位器项、直线吊弦项,教材口径)并按张力差判据校核。',\n formula: [\n '曲线定位器项:T_jw = d·T_jm/R',\n '直线吊弦项:T_jd = L(L−l)·g_j·α·Δt/(2c)',\n '判据:ΔT ≤ 10%·T_N(TB 10009-2016 第 5.4.7 条)',\n ],\n references: [\n '判据:接触线、承力索张力差均不得大于额定张力 10%(TB 10009-2016 5.4.7)',\n '教材口径(于万聚《电气化铁道接触网设计》体系)',\n '直线吊弦项量纲:m²·kN/m·(1/℃)·℃/m = kN,2026-09-13 复核自洽',\n ],\n scope: ['曲线半径 R:100~4000 m', '定位器长 d:0.5~2.5 m', '半锚段 L:100~2000 m', '跨距 l:30~90 m'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/anchor-length/',\n};\n","export { anchorLengthMeta } from './meta';\n\n/** 张力增量判据(TB 10009-2016 第 5.4.7 条) */\nexport const TENSION_DIFF_RATIO = 0.10;\n\n/** 锚段张力增量计算参数(教材口径,直线吊弦项量纲已复核)。单位:m、kN、1/℃、℃。 */\nexport interface AnchorLengthInput {\n /** 区段类型:'line' 直线 | 'curve' 曲线 */\n readonly section: 'line' | 'curve';\n /** 接触线额定张力 T_N,kN(判据基准) */\n readonly ratedTensionKN: number;\n /** 半锚段长度 L(中心锚结至补偿器),m */\n readonly halfSpanM?: number;\n /** 曲线半径 R,m(曲线区段) */\n readonly curveRadiusM?: number;\n /** 定位器长度 d,m(曲线区段) */\n readonly regulatorLengthM?: number;\n /** 定位器数量 n(曲线区段) */\n readonly regulatorCount?: number;\n /** 跨距 l,m(直线吊弦项) */\n readonly spanM?: number;\n /** 吊弦平均长度 c,m(直线吊弦项) */\n readonly dropperLengthM?: number;\n /** 接触线单位重 g_j,kN/m(直线吊弦项) */\n readonly wireWeightKNPerM?: number;\n /** 线胀系数 α,1/℃(直线吊弦项) */\n readonly expansionCoeff?: number;\n /** 计算温差 Δt,℃(直线吊弦项) */\n readonly tempDeltaC?: number;\n}\n\nexport interface AnchorLengthResult {\n /** 张力增量,N */\n readonly deltaN: number;\n /** 判据限值 10%·T_N,N */\n readonly limitN: number;\n /** 张力差占额定张力比例 */\n readonly ratio: number;\n /** 是否合格(ΔT ≤ 10%·T_N) */\n readonly passes: boolean;\n}\n\n/** 锚段张力增量(教材口径)与 10% 判据校核 */\nexport function anchorLengthCheck(input: AnchorLengthInput): AnchorLengthResult {\n const { section, ratedTensionKN } = input;\n if (!(ratedTensionKN > 0)) throw new RangeError('额定张力必须为正,收到 ' + ratedTensionKN + ' kN');\n let deltaN: number;\n if (section === 'curve') {\n const { curveRadiusM, regulatorLengthM, regulatorCount } = input;\n if (!(curveRadiusM && curveRadiusM > 0)) throw new RangeError('曲线半径必须为正');\n if (!(regulatorLengthM && regulatorLengthM > 0)) throw new RangeError('定位器长度必须为正');\n const n = regulatorCount ?? 1;\n const one = (regulatorLengthM * ratedTensionKN * 1e3) / curveRadiusM; // T_jw = d·T_jm/R\n deltaN = one * n;\n } else {\n const { halfSpanM, spanM, dropperLengthM, wireWeightKNPerM, expansionCoeff, tempDeltaC } = input;\n if (!(halfSpanM && halfSpanM > 0)) throw new RangeError('半锚段长度必须为正');\n if (!(spanM && spanM > 0)) throw new RangeError('跨距必须为正');\n if (!(dropperLengthM && dropperLengthM > 0)) throw new RangeError('吊弦长度必须为正');\n if (wireWeightKNPerM === undefined || expansionCoeff === undefined || tempDeltaC === undefined) {\n throw new RangeError('直线区段需提供 g_j、α、Δt');\n }\n // T_jd = L(L−l)·g_j·α·Δt/(2c),kN → N\n deltaN = (halfSpanM * (halfSpanM - spanM) * wireWeightKNPerM * expansionCoeff * tempDeltaC) / (2 * dropperLengthM) * 1e3;\n }\n const limitN = TENSION_DIFF_RATIO * ratedTensionKN * 1e3;\n return { deltaN, limitN, ratio: deltaN / limitN, passes: deltaN <= limitN };\n}\n"]}
@@ -0,0 +1,163 @@
1
+ // src/cross-span/meta.ts
2
+ var crossSpanMeta = {
3
+ name: "\u8F6F\u6A2A\u8DE8\u8D1F\u8F7D\u8BA1\u7B97",
4
+ nameEn: "Soft Cross-Span Load Calculation",
5
+ summary: "\u6309\u8D1F\u8F7D\u8BA1\u7B97\u6CD5\uFF08\u6559\u6750\u53E3\u5F84\uFF09\u8BA1\u7B97\u8F6F\u6A2A\u8DE8\u5404\u8282\u70B9\u5782\u76F4\u8D1F\u8F7D\u3001\u629B\u7269\u7EBF\u8282\u70B9\u5F1B\u5EA6\u3001\u6C34\u5E73\u5F20\u529B\u4E0E\u603B\u7D22\u957F\uFF0C\u7528\u4E8E\u63A5\u89E6\u7F51\u8F6F\u6A2A\u8DE8\u8BBE\u8BA1\u6821\u6838\u3002",
6
+ formula: [
7
+ "\u8282\u70B9\u5782\u76F4\u8D1F\u8F7D\uFF08\u5747\u5300\u95F4\u8DDD\u7B80\u5316\uFF09\uFF1AQ_i = J + n\xB7q\u2080\xB7a + P + g_c\xB7a",
8
+ "\u8282\u70B9\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u5206\u5E03\uFF0C\u6700\u4F4E\u70B9\u5728 l\u2081\uFF09\uFF1Af_i = f_max\xB7(1 \u2212 ((x_i\u2212l\u2081)/c_i)\xB2)\uFF0Cc_i = l\u2081\uFF08x_i\u2264l\u2081\uFF09\u6216 L\u2212l\u2081\uFF08x_i>l\u2081\uFF09",
9
+ "\u6C34\u5E73\u5F20\u529B\uFF08\u7CBE\u786E\u5F0F\uFF09\uFF1AH = M(l\u2081)/f_max\uFF0CM(l\u2081) \u4E3A\u60AC\u6302\u8D1F\u8F7D\u5BF9\u6700\u4F4E\u70B9\u622A\u9762\uFF08\u7B80\u652F\u6881\uFF09\u5F2F\u77E9",
10
+ "\u6C34\u5E73\u5F20\u529B\uFF08\u7B80\u5316\u5F0F\u5BF9\u7167\uFF09\uFF1AH\u2032 = \u03A3Q_i\xB7l\u2081/(2\xB7f_max)",
11
+ "\u5206\u6BB5\u7D22\u957F\uFF1Ab_i \u2248 a + (f_{i+1}\u2212f_i)\xB2/(2a)",
12
+ "\u652F\u67F1\u951A\u56FA\u6BB5\uFF1Ab_end = x\u2081 + f\u2081\xB2/(2\xB7x\u2081)\uFF0C\u652F\u67F1\u7AEF\u5F1B\u5EA6\u4E3A 0",
13
+ "\u603B\u7D22\u957F\uFF1A\u03A3b = b_endL + \u03A3b_i + b_endR"
14
+ ],
15
+ references: [
16
+ "\u6559\u6750\u8D1F\u8F7D\u8BA1\u7B97\u6CD5\uFF08\u8F6F\u6A2A\u8DE8\uFF09\uFF0C\u8282\u70B9\u8D1F\u8F7D\u6309\u5927\u7AD9 65 kg / \u5C0F\u7AD9 45 kg \u53D6\u503C",
17
+ "\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E\u5F1B\u8DE8\u6BD4 f/L \u2264 1/10 \u5DE5\u51B5",
18
+ "2026-09-14 \u7AD9\u957F\u63D0\u4F9B\u6587\u672C\u6838\u5BF9\uFF08\u8D1F\u8F7D\u8BA1\u7B97\u6CD5\uFF09"
19
+ ],
20
+ scope: [
21
+ "\u8282\u70B9\u6570 N\uFF1A2 ~ 20",
22
+ "\u80A1\u9053\u95F4\u8DDD a\uFF1A4 ~ 8 m",
23
+ "\u8DE8\u8DDD L\uFF1A15 ~ 80 m",
24
+ "\u8282\u70B9\u8D1F\u8F7D J\uFF1A45 / 65 kg",
25
+ "\u63A5\u89E6\u60AC\u6302\u5355\u4F4D\u91CD q\u2080\uFF1A1.0 ~ 3.0 kg/m",
26
+ "\u60AC\u6302\u7EC4\u6570 n\uFF1A1 ~ 3",
27
+ "\u6A2A\u627F\u7D22 + \u5B9A\u4F4D\u7D22\u5355\u4F4D\u91CD g_c\uFF1A0.2 ~ 1.5 kg/m",
28
+ "\u6700\u5927\u5F1B\u5EA6 f_max\uFF1A1 ~ 6 m\uFF0C\u987B\u5C0F\u4E8E\u6700\u4F4E\u70B9\u4E24\u4FA7\u60AC\u6302\u9AD8\u5EA6",
29
+ "\u672A\u8BA1\u5165\u6E29\u5EA6\u5BF9\u7D22\u957F\u4E0E\u5F20\u529B\u7684\u5F71\u54CD\u3001\u6A2A\u627F\u7D22\u5F27\u5782\u975E\u7EBF\u6027\u4FEE\u6B63"
30
+ ],
31
+ 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",
32
+ online: "https://www.itswe.com/calculator/cross-span/"
33
+ };
34
+
35
+ // src/cross-span/index.ts
36
+ function crossSpanAnalyze(input) {
37
+ const {
38
+ nodeCount,
39
+ spacingM: a,
40
+ spanTotalM: L,
41
+ lowPointFromLeftM: l1,
42
+ maxSagM: fMax,
43
+ nodeLoadKg: J,
44
+ suspensionWeightKgPerM: q0,
45
+ suspensionGroups: n,
46
+ cableWeightKgPerM: gc,
47
+ insulatorDistributedKg: P
48
+ } = input;
49
+ if (!Number.isInteger(nodeCount) || !(nodeCount >= 2)) {
50
+ throw new RangeError(`\u8282\u70B9\u6570\u987B\u4E3A\u4E0D\u5C0F\u4E8E 2 \u7684\u6574\u6570\uFF0C\u6536\u5230 ${nodeCount}`);
51
+ }
52
+ if (!(a > 0)) {
53
+ throw new RangeError(`\u80A1\u9053\u95F4\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${a} m`);
54
+ }
55
+ if (!(L > 0)) {
56
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${L} m`);
57
+ }
58
+ if (!(l1 > 0 && l1 < L)) {
59
+ throw new RangeError(`\u6700\u4F4E\u70B9\u8DDD\u5DE6\u652F\u67F1\u8DDD\u79BB\u987B\u5728 (0, L) \u5185\uFF0C\u6536\u5230 ${l1} m`);
60
+ }
61
+ if (!(fMax > 0)) {
62
+ throw new RangeError(`\u6700\u5927\u5F1B\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${fMax} m`);
63
+ }
64
+ if (!(J >= 0)) {
65
+ throw new RangeError(`\u8282\u70B9\u8D1F\u8F7D\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${J} kg`);
66
+ }
67
+ if (!(q0 >= 0)) {
68
+ throw new RangeError(`\u63A5\u89E6\u60AC\u6302\u5355\u4F4D\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${q0} kg/m`);
69
+ }
70
+ if (!(n > 0)) {
71
+ throw new RangeError(`\u6BCF\u8282\u70B9\u60AC\u6302\u7EC4\u6570\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${n}`);
72
+ }
73
+ if (!(gc >= 0)) {
74
+ throw new RangeError(`\u6A2A\u627F\u7D22\u5355\u4F4D\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${gc} kg/m`);
75
+ }
76
+ if (!(P >= 0)) {
77
+ throw new RangeError(`\u7EDD\u7F18\u5B50\u4E32\u5206\u644A\u8D1F\u8F7D\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${P} kg`);
78
+ }
79
+ const lastX = a * nodeCount;
80
+ if (!(lastX < L)) {
81
+ throw new RangeError(
82
+ `\u672B\u8282\u70B9\u4F4D\u7F6E ${lastX} m \u8D85\u51FA\u8DE8\u8DDD ${L} m\uFF0C\u8BF7\u51CF\u5C0F\u8282\u70B9\u6570\u6216\u80A1\u9053\u95F4\u8DDD`
83
+ );
84
+ }
85
+ const Q = J + n * q0 * a + P + gc * a;
86
+ const nodeX = [];
87
+ for (let i = 0; i < nodeCount; i++) {
88
+ nodeX.push(a * (i + 1));
89
+ }
90
+ const nodeQ = nodeX.map(() => Q);
91
+ const nodeSag = nodeX.map((x) => {
92
+ const c = x <= l1 ? l1 : L - l1;
93
+ return fMax * (1 - (x - l1) / c * ((x - l1) / c));
94
+ });
95
+ const segmentLength = [];
96
+ for (let i = 0; i < nodeCount - 1; i++) {
97
+ const fi = nodeSag[i];
98
+ const fj = nodeSag[i + 1];
99
+ if (fi === void 0 || fj === void 0) {
100
+ throw new Error(`\u7F3A\u5C11\u8282\u70B9 ${i} \u6216 ${i + 1} \u7684\u5F1B\u5EA6`);
101
+ }
102
+ const d = fj - fi;
103
+ segmentLength.push(a + d * d / (2 * a));
104
+ }
105
+ const x0 = nodeX[0];
106
+ const f0 = nodeSag[0];
107
+ if (x0 === void 0 || f0 === void 0) {
108
+ throw new Error("\u7F3A\u5C11\u9996\u8282\u70B9\u4F4D\u7F6E\u6216\u5F1B\u5EA6");
109
+ }
110
+ const endLeftM = x0 + f0 * f0 / (2 * x0);
111
+ const xLast = nodeX[nodeX.length - 1];
112
+ const fLast = nodeSag[nodeSag.length - 1];
113
+ if (xLast === void 0 || fLast === void 0) {
114
+ throw new Error("\u7F3A\u5C11\u672B\u8282\u70B9\u4F4D\u7F6E\u6216\u5F1B\u5EA6");
115
+ }
116
+ const gapRight = L - xLast;
117
+ const endRightM = gapRight + fLast * fLast / (2 * gapRight);
118
+ let segmentSum = 0;
119
+ for (const b of segmentLength) segmentSum += b;
120
+ const totalLengthM = endLeftM + segmentSum + endRightM;
121
+ let rLeft = 0;
122
+ for (let i = 0; i < nodeCount; i++) {
123
+ const x = nodeX[i];
124
+ const q = nodeQ[i];
125
+ if (x === void 0 || q === void 0) {
126
+ throw new Error(`\u7F3A\u5C11\u8282\u70B9 ${i} \u7684\u4F4D\u7F6E\u6216\u8D1F\u8F7D`);
127
+ }
128
+ rLeft += q * (L - x) / L;
129
+ }
130
+ let moment = rLeft * l1;
131
+ for (let i = 0; i < nodeCount; i++) {
132
+ const x = nodeX[i];
133
+ const q = nodeQ[i];
134
+ if (x === void 0 || q === void 0) {
135
+ throw new Error(`\u7F3A\u5C11\u8282\u70B9 ${i} \u7684\u4F4D\u7F6E\u6216\u8D1F\u8F7D`);
136
+ }
137
+ if (x < l1) {
138
+ moment -= q * (l1 - x);
139
+ }
140
+ }
141
+ const horizontalForceKg = moment / fMax;
142
+ let totalLoadKg = 0;
143
+ for (const q of nodeQ) totalLoadKg += q;
144
+ const horizontalForceSimpleKg = totalLoadKg * l1 / (2 * fMax);
145
+ return {
146
+ nodeX,
147
+ nodeQ,
148
+ nodeSag,
149
+ segmentLength,
150
+ endLeftM,
151
+ endRightM,
152
+ totalLengthM,
153
+ horizontalForceKg,
154
+ horizontalForceSimpleKg,
155
+ totalLoadKg
156
+ };
157
+ }
158
+
159
+ export {
160
+ crossSpanMeta,
161
+ crossSpanAnalyze
162
+ };
163
+ //# sourceMappingURL=chunk-D5F5ES2R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cross-span/meta.ts","../src/cross-span/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const crossSpanMeta: CalculatorMeta = {\n name: '软横跨负载计算',\n nameEn: 'Soft Cross-Span Load Calculation',\n summary:\n '按负载计算法(教材口径)计算软横跨各节点垂直负载、抛物线节点弛度、水平张力与总索长,用于接触网软横跨设计校核。',\n formula: [\n '节点垂直负载(均匀间距简化):Q_i = J + n·q₀·a + P + g_c·a',\n '节点弛度(抛物线分布,最低点在 l₁):f_i = f_max·(1 − ((x_i−l₁)/c_i)²),c_i = l₁(x_i≤l₁)或 L−l₁(x_i>l₁)',\n '水平张力(精确式):H = M(l₁)/f_max,M(l₁) 为悬挂负载对最低点截面(简支梁)弯矩',\n '水平张力(简化式对照):H′ = ΣQ_i·l₁/(2·f_max)',\n '分段索长:b_i ≈ a + (f_{i+1}−f_i)²/(2a)',\n '支柱锚固段:b_end = x₁ + f₁²/(2·x₁),支柱端弛度为 0',\n '总索长:Σb = b_endL + Σb_i + b_endR',\n ],\n references: [\n '教材负载计算法(软横跨),节点负载按大站 65 kg / 小站 45 kg 取值',\n '抛物线近似,适用于弛跨比 f/L ≤ 1/10 工况',\n '2026-09-14 站长提供文本核对(负载计算法)',\n ],\n scope: [\n '节点数 N:2 ~ 20',\n '股道间距 a:4 ~ 8 m',\n '跨距 L:15 ~ 80 m',\n '节点负载 J:45 / 65 kg',\n '接触悬挂单位重 q₀:1.0 ~ 3.0 kg/m',\n '悬挂组数 n:1 ~ 3',\n '横承索 + 定位索单位重 g_c:0.2 ~ 1.5 kg/m',\n '最大弛度 f_max:1 ~ 6 m,须小于最低点两侧悬挂高度',\n '未计入温度对索长与张力的影响、横承索弧垂非线性修正',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/cross-span/',\n};\n","export { crossSpanMeta } from './meta';\n\n/** 软横跨负载计算(负载计算法)的输入参数 */\nexport interface CrossSpanNodeInput {\n /** 股道悬挂节点数 N */\n readonly nodeCount: number;\n /** 股道间距 a,m(节点近似均匀分布,起点距支柱 a) */\n readonly spacingM: number;\n /** 横承索跨距 L,m */\n readonly spanTotalM: number;\n /** 最低点距左支柱距离 l₁,m */\n readonly lowPointFromLeftM: number;\n /** 最大弛度 f_max,m(最低点弛度) */\n readonly maxSagM: number;\n /** 节点负载 J,kg(大站 65 / 小站 45) */\n readonly nodeLoadKg: number;\n /** 接触悬挂单位重 q₀,kg/m */\n readonly suspensionWeightKgPerM: number;\n /** 每节点悬挂组数 n */\n readonly suspensionGroups: number;\n /** 横承索 + 定位索单位重 g_c,kg/m */\n readonly cableWeightKgPerM: number;\n /** 绝缘子串分摊负载 P,kg */\n readonly insulatorDistributedKg: number;\n}\n\n/** 软横跨负载计算结果 */\nexport interface CrossSpanResult {\n /** 各节点距左支柱距离 x_i,m */\n readonly nodeX: readonly number[];\n /** 各节点垂直负载 Q_i,kg */\n readonly nodeQ: readonly number[];\n /** 各节点弛度 f_i,m */\n readonly nodeSag: readonly number[];\n /** 相邻节点间分段索长 b_i,m(共 N−1 段) */\n readonly segmentLength: readonly number[];\n /** 左端支柱锚固段索长,m */\n readonly endLeftM: number;\n /** 右端支柱锚固段索长,m */\n readonly endRightM: number;\n /** 总索长 Σb,m */\n readonly totalLengthM: number;\n /** 水平张力(力矩平衡精确式)H = M(l₁)/f_max,kg */\n readonly horizontalForceKg: number;\n /** 水平张力(简化式对照)H' = ΣQ_i·l₁/(2·f_max),kg */\n readonly horizontalForceSimpleKg: number;\n /** 总垂直负载 ΣQ,kg */\n readonly totalLoadKg: number;\n}\n\n/**\n * 软横跨负载计算(负载计算法,教材口径)。\n *\n * 节点垂直负载(均匀间距简化):\n * Q_i = J + n·q₀·a + P + g_c·a\n *\n * 节点弛度(抛物线分布,最低点在 l₁):\n * f_i = f_max·(1 − ((x_i−l₁)/c_i)²),c_i = l₁(x_i≤l₁)或 L−l₁(x_i>l₁)\n *\n * 水平张力:精确式 H = M(l₁)/f_max,其中 M(l₁) 为悬挂负载对最低点截面的\n * 简支梁弯矩;简化式对照 H' = ΣQ_i·l₁/(2·f_max)。\n *\n * 分段索长:b_i ≈ a + (f_{i+1}−f_i)²/(2a);两端支柱锚固段\n * b_end = x₁ + f₁²/(2·x₁)(支柱端弛度为 0)。\n */\nexport function crossSpanAnalyze(input: CrossSpanNodeInput): CrossSpanResult {\n const {\n nodeCount,\n spacingM: a,\n spanTotalM: L,\n lowPointFromLeftM: l1,\n maxSagM: fMax,\n nodeLoadKg: J,\n suspensionWeightKgPerM: q0,\n suspensionGroups: n,\n cableWeightKgPerM: gc,\n insulatorDistributedKg: P,\n } = input;\n\n if (!Number.isInteger(nodeCount) || !(nodeCount >= 2)) {\n throw new RangeError(`节点数须为不小于 2 的整数,收到 ${nodeCount}`);\n }\n if (!(a > 0)) {\n throw new RangeError(`股道间距必须为正数,收到 ${a} m`);\n }\n if (!(L > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${L} m`);\n }\n if (!(l1 > 0 && l1 < L)) {\n throw new RangeError(`最低点距左支柱距离须在 (0, L) 内,收到 ${l1} m`);\n }\n if (!(fMax > 0)) {\n throw new RangeError(`最大弛度必须为正数,收到 ${fMax} m`);\n }\n if (!(J >= 0)) {\n throw new RangeError(`节点负载不能为负,收到 ${J} kg`);\n }\n if (!(q0 >= 0)) {\n throw new RangeError(`接触悬挂单位重不能为负,收到 ${q0} kg/m`);\n }\n if (!(n > 0)) {\n throw new RangeError(`每节点悬挂组数须为正数,收到 ${n}`);\n }\n if (!(gc >= 0)) {\n throw new RangeError(`横承索单位重不能为负,收到 ${gc} kg/m`);\n }\n if (!(P >= 0)) {\n throw new RangeError(`绝缘子串分摊负载不能为负,收到 ${P} kg`);\n }\n\n // 节点均匀分布:第 i 个节点距左支柱 x = a·(i+1),须全部落在跨内\n const lastX = a * nodeCount;\n if (!(lastX < L)) {\n throw new RangeError(\n `末节点位置 ${lastX} m 超出跨距 ${L} m,请减小节点数或股道间距`,\n );\n }\n\n const Q = J + n * q0 * a + P + gc * a;\n\n const nodeX: number[] = [];\n for (let i = 0; i < nodeCount; i++) {\n nodeX.push(a * (i + 1));\n }\n\n const nodeQ: number[] = nodeX.map(() => Q);\n const nodeSag: number[] = nodeX.map((x) => {\n const c = x <= l1 ? l1 : L - l1;\n return fMax * (1 - ((x - l1) / c) * ((x - l1) / c));\n });\n\n // 相邻节点间分段索长 b_i = a + (f_{i+1}−f_i)²/(2a)\n const segmentLength: number[] = [];\n for (let i = 0; i < nodeCount - 1; i++) {\n const fi = nodeSag[i];\n const fj = nodeSag[i + 1];\n if (fi === undefined || fj === undefined) {\n throw new Error(`缺少节点 ${i} 或 ${i + 1} 的弛度`);\n }\n const d = fj - fi;\n segmentLength.push(a + (d * d) / (2 * a));\n }\n\n // 两端支柱锚固段(支柱端弛度为 0)\n const x0 = nodeX[0];\n const f0 = nodeSag[0];\n if (x0 === undefined || f0 === undefined) {\n throw new Error('缺少首节点位置或弛度');\n }\n const endLeftM = x0 + (f0 * f0) / (2 * x0);\n\n const xLast = nodeX[nodeX.length - 1];\n const fLast = nodeSag[nodeSag.length - 1];\n if (xLast === undefined || fLast === undefined) {\n throw new Error('缺少末节点位置或弛度');\n }\n const gapRight = L - xLast;\n const endRightM = gapRight + (fLast * fLast) / (2 * gapRight);\n\n let segmentSum = 0;\n for (const b of segmentLength) segmentSum += b;\n const totalLengthM = endLeftM + segmentSum + endRightM;\n\n // 水平张力(力矩平衡精确式):以左右支柱为简支梁,求最低点截面弯矩\n let rLeft = 0;\n for (let i = 0; i < nodeCount; i++) {\n const x = nodeX[i];\n const q = nodeQ[i];\n if (x === undefined || q === undefined) {\n throw new Error(`缺少节点 ${i} 的位置或负载`);\n }\n rLeft += (q * (L - x)) / L;\n }\n let moment = rLeft * l1;\n for (let i = 0; i < nodeCount; i++) {\n const x = nodeX[i];\n const q = nodeQ[i];\n if (x === undefined || q === undefined) {\n throw new Error(`缺少节点 ${i} 的位置或负载`);\n }\n if (x < l1) {\n moment -= q * (l1 - x);\n }\n }\n const horizontalForceKg = moment / fMax;\n\n let totalLoadKg = 0;\n for (const q of nodeQ) totalLoadKg += q;\n\n const horizontalForceSimpleKg = (totalLoadKg * l1) / (2 * fMax);\n\n return {\n nodeX,\n nodeQ,\n nodeSag,\n segmentLength,\n endLeftM,\n endRightM,\n totalLengthM,\n horizontalForceKg,\n horizontalForceSimpleKg,\n totalLoadKg,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/bvalue/meta.ts
2
+ var bvalueMeta = {
3
+ name: "b\u503C\uFF08\u5760\u7823\u9AD8\u5EA6\uFF09\u5B89\u88C5\u66F2\u7EBF",
4
+ nameEn: "B-Value (Balance Weight) Installation Curve",
5
+ summary: "\u6309 b_x = b_min + n\xB7\u03B1\xB7L\xB7(t_max \u2212 t_x) \u8BA1\u7B97\u4EFB\u4E00\u6E29\u5EA6\u4E0B\u5760\u7823\u5E95\u9762\u8DDD\u5730\u9762\u9AD8\u5EA6\uFF0C\u7528\u4E8E\u5760\u7823\u5B89\u88C5\u4E0E\u68C0\u8C03\u5B9A\u4F4D\u3002",
6
+ formula: [
7
+ "b_x = b_min + n\xB7\u03B1\xB7L\xB7(t_max \u2212 t_x)",
8
+ "\u5760\u7823\u4FA7\u884C\u7A0B\u53D8\u5316 n\xB7\u0394L\uFF0C\u0394L = \u03B1\xB7L\xB7(t_max \u2212 t_x)",
9
+ "\u5760\u7823\u4FA7\u5F20\u529B W = T/n\uFF0C\u5BF9\u5E94\u5760\u7823\u603B\u8D28\u91CF m \u2248 102\xB7W kg"
10
+ ],
11
+ references: [
12
+ "\u9650\u503C\u53E3\u5F84\uFF1A\u8FD0\u884C \u2265200 mm\u3001\u504F\u5DEE \xB1100 mm\uFF08TB 10421-2018 \u7B2C 5.22.3 \u6761\uFF09",
13
+ "\u8BBE\u8BA1 \u2265300 mm\uFF08\u671F\u520A\u5F15\u94C1\u8FD0\u30142007\u301569 \u53F7\uFF09",
14
+ "\u4F20\u52A8\u6BD4\u500D\u6570 n\uFF1A1:3 \u5373 n=3"
15
+ ],
16
+ scope: ["b_min\uFF1A50~1000 mm", "\u534A\u951A\u6BB5 L\uFF1A50000~900000 mm", "\u6E29\u5EA6\u5DEE\uFF1A0~100 \u2103", "\u4F20\u52A8\u6BD4\uFF1A2~4"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/bvalue/"
19
+ };
20
+
21
+ // src/bvalue/index.ts
22
+ function bValue(params) {
23
+ const { minBMM, ratio, expansionCoeff, halfSpanMM, maxTempC, targetTempC, tensionKN } = params;
24
+ if (!(minBMM >= 0)) throw new RangeError("b_min \u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 " + minBMM);
25
+ if (!(ratio > 0)) throw new RangeError("\u4F20\u52A8\u6BD4\u500D\u6570\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + ratio);
26
+ if (!(halfSpanMM > 0)) throw new RangeError("\u534A\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + halfSpanMM);
27
+ const dt = maxTempC - targetTempC;
28
+ const stretchMM = expansionCoeff * halfSpanMM * dt;
29
+ const strokeMM = ratio * stretchMM;
30
+ const bMM = minBMM + strokeMM;
31
+ let weightKg = null;
32
+ if (tensionKN !== void 0) {
33
+ if (!(tensionKN > 0)) throw new RangeError("\u989D\u5B9A\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + tensionKN);
34
+ const WKN = tensionKN / ratio;
35
+ weightKg = WKN * 102;
36
+ }
37
+ return { bMM, stretchMM, strokeMM, weightKg };
38
+ }
39
+
40
+
41
+
42
+
43
+ exports.bvalueMeta = bvalueMeta; exports.bValue = bValue;
44
+ //# sourceMappingURL=chunk-HXALVJ4G.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-HXALVJ4G.cjs","../src/bvalue/meta.ts","../src/bvalue/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,WAAA,EAA6B;AAAA,EACxC,IAAA,EAAM,qEAAA;AAAA,EACN,MAAA,EAAQ,6CAAA;AAAA,EACR,OAAA,EAAS,4OAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,sDAAA;AAAA,IACA,0GAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,oIAAA;AAAA,IACA,8FAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,uBAAA,EAAoB,2CAAA,EAAyB,sCAAA,EAAe,6BAAS,CAAA;AAAA,EAC7E,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AEYO,SAAS,MAAA,CAAO,MAAA,EAAmC;AACxD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAgB,UAAA,EAAY,QAAA,EAAU,WAAA,EAAa,UAAU,EAAA,EAAI,MAAA;AACxF,EAAA,GAAA,CAAI,CAAA,CAAE,OAAA,GAAU,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,oDAAA,EAAmB,MAAM,CAAA;AAClE,EAAA,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,4EAAA,EAAkB,KAAK,CAAA;AAC9D,EAAA,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,4EAAA,EAAkB,UAAU,CAAA;AACxE,EAAA,MAAM,GAAA,EAAK,SAAA,EAAW,WAAA;AACtB,EAAA,MAAM,UAAA,EAAY,eAAA,EAAiB,WAAA,EAAa,EAAA;AAChD,EAAA,MAAM,SAAA,EAAW,MAAA,EAAQ,SAAA;AACzB,EAAA,MAAM,IAAA,EAAM,OAAA,EAAS,QAAA;AACrB,EAAA,IAAI,SAAA,EAA0B,IAAA;AAC9B,EAAA,GAAA,CAAI,UAAA,IAAc,KAAA,CAAA,EAAW;AAC3B,IAAA,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,sEAAA,EAAiB,SAAS,CAAA;AACrE,IAAA,MAAM,IAAA,EAAM,UAAA,EAAY,KAAA;AACxB,IAAA,SAAA,EAAW,IAAA,EAAM,GAAA;AAAA,EACnB;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,SAAS,CAAA;AAC9C;AFVA;AACA;AACE;AACA;AACF,yDAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-HXALVJ4G.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const bvalueMeta: CalculatorMeta = {\n name: 'b值(坠砣高度)安装曲线',\n nameEn: 'B-Value (Balance Weight) Installation Curve',\n summary: '按 b_x = b_min + n·α·L·(t_max − t_x) 计算任一温度下坠砣底面距地面高度,用于坠砣安装与检调定位。',\n formula: [\n 'b_x = b_min + n·α·L·(t_max − t_x)',\n '坠砣侧行程变化 n·ΔL,ΔL = α·L·(t_max − t_x)',\n '坠砣侧张力 W = T/n,对应坠砣总质量 m ≈ 102·W kg',\n ],\n references: [\n '限值口径:运行 ≥200 mm、偏差 ±100 mm(TB 10421-2018 第 5.22.3 条)',\n '设计 ≥300 mm(期刊引铁运〔2007〕69 号)',\n '传动比倍数 n:1:3 即 n=3',\n ],\n scope: ['b_min:50~1000 mm', '半锚段 L:50000~900000 mm', '温度差:0~100 ℃', '传动比:2~4'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/bvalue/',\n};\n","export { bvalueMeta } from './meta';\n\n/** b 值(坠砣底面距地面高度)计算参数。单位:长度 mm、温度 ℃、张力 kN。 */\nexport interface BValueInput {\n /** 设计最小 b 值 b_min,mm(最高温度时坠砣最低位) */\n readonly minBMM: number;\n /** 传动比倍数 n(1:3 取 3) */\n readonly ratio: number;\n /** 线膨胀系数 α,1/℃(铜合金约 1.7e-5) */\n readonly expansionCoeff: number;\n /** 半锚段长度 L,mm */\n readonly halfSpanMM: number;\n /** 最高工作温度 t_max,℃ */\n readonly maxTempC: number;\n /** 安装/检调温度 t_x,℃ */\n readonly targetTempC: number;\n /** 额定张力 T,kN(用于坠砣重量换算) */\n readonly tensionKN?: number;\n}\n\nexport interface BValueResult {\n /** 当前温度 b 值 b_x,mm */\n readonly bMM: number;\n /** 温度伸缩量 ΔL = α·L·(t_max − t_x),mm */\n readonly stretchMM: number;\n /** 坠砣侧行程变化 n·ΔL,mm */\n readonly strokeMM: number;\n /** 坠砣总质量(W=T/n,m≈102·W,g 取 9.81 m/s²),kg */\n readonly weightKg: number | null;\n}\n\n/** b 值计算:b_x = b_min + n·α·L·(t_max − t_x) */\nexport function bValue(params: BValueInput): BValueResult {\n const { minBMM, ratio, expansionCoeff, halfSpanMM, maxTempC, targetTempC, tensionKN } = params;\n if (!(minBMM >= 0)) throw new RangeError('b_min 不能为负,收到 ' + minBMM);\n if (!(ratio > 0)) throw new RangeError('传动比倍数必须为正,收到 ' + ratio);\n if (!(halfSpanMM > 0)) throw new RangeError('半锚段长度必须为正,收到 ' + halfSpanMM);\n const dt = maxTempC - targetTempC;\n const stretchMM = expansionCoeff * halfSpanMM * dt;\n const strokeMM = ratio * stretchMM;\n const bMM = minBMM + strokeMM;\n let weightKg: number | null = null;\n if (tensionKN !== undefined) {\n if (!(tensionKN > 0)) throw new RangeError('额定张力必须为正,收到 ' + tensionKN);\n const WKN = tensionKN / ratio;\n weightKg = WKN * 102; // 1 kN ≈ 102 kg(g=9.81)\n }\n return { bMM, stretchMM, strokeMM, weightKg };\n}\n"]}
@@ -0,0 +1,42 @@
1
+ // src/cantilever/meta.ts
2
+ var cantileverMeta = {
3
+ name: "\u8155\u81C2\u9884\u914D\uFF08\u659C\u8155\u81C2\u52FE\u80A1\u4E0B\u6599\uFF09",
4
+ nameEn: "Cantilever Pre-assembly (Pythagorean)",
5
+ summary: "\u6309\u52FE\u80A1\u51E0\u4F55\u8BA1\u7B97\u659C\u8155\u81C2\u4E0B\u6599\u957F\u5EA6\u4E0E\u5B9A\u4F4D\u73AF\u5B89\u88C5\u4F4D\u7F6E\uFF0C\u9644 TB 10758 \u9884\u914D\u5141\u5DEE\u3002",
6
+ formula: [
7
+ "\u659C\u8155\u81C2\u7BA1\u957F L = \u221A(h\xB2+d\xB2) \u2212 \u0394c",
8
+ "\u5B9A\u4F4D\u73AF\u4F4D\u7F6E s = (y_d/h)\xB7\u221A(h\xB2+d\xB2)",
9
+ "\u9884\u914D\u5141\u5DEE \xB15 mm\uFF08TB 10758-2018 \u7B2C 5.10.1 \u6761\uFF09\uFF1B\u5B89\u88C5\u5141\u5DEE \xB120 mm\uFF08\u7B2C 5.10.2 \u6761\uFF09"
10
+ ],
11
+ references: [
12
+ "\u52FE\u80A1\u51E0\u4F55\u4E3A\u5E73\u9762\u51E0\u4F55\u6052\u7B49\u5F0F\uFF08\u51E0\u4F55\u81EA\u8BC1\uFF09",
13
+ "TB 10758-2018 \u7B2C 5.10.1/5.10.2 \u6761\uFF08\u9884\u914D/\u5B89\u88C5\u5141\u5DEE\u5206\u79BB\uFF09",
14
+ "\u7AEF\u90E8\u6263\u51CF \u0394c \u6309 TB/T 2075 \u7CFB\u5217\u96F6\u4EF6\u5C3A\u5BF8"
15
+ ],
16
+ scope: ["\u7AD6\u76F4\u8DDD h\uFF1A0.8~4 m", "\u6C34\u5E73\u6295\u5F71 d\uFF1A0.3~4 m", "\u7AEF\u90E8\u6263\u51CF\uFF1A0~0.6 m"],
17
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5B9E\u9645\u9884\u914D\u4EE5\u7EBF\u8DEF\u88C5\u914D\u56FE\u4E0E\u96F6\u4EF6\u5B9E\u7269\u5C3A\u5BF8\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
18
+ online: "https://www.itswe.com/calculator/cantilever/"
19
+ };
20
+
21
+ // src/cantilever/index.ts
22
+ var ASSEMBLY_TOLERANCE_MM = 5;
23
+ function cantileverCut(input) {
24
+ const { verticalOffsetM, horizontalProjectionM, endDeductionM, regHeightM } = input;
25
+ if (!(verticalOffsetM > 0)) throw new RangeError("\u7AD6\u76F4\u8DDD\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + verticalOffsetM + " m");
26
+ if (!(horizontalProjectionM > 0)) throw new RangeError("\u6C34\u5E73\u6295\u5F71\u5FC5\u987B\u4E3A\u6B63\uFF0C\u6536\u5230 " + horizontalProjectionM + " m");
27
+ const fullLengthM = Math.sqrt(verticalOffsetM * verticalOffsetM + horizontalProjectionM * horizontalProjectionM);
28
+ const cutLengthM = fullLengthM - (endDeductionM ?? 0);
29
+ let regulatorPosM = null;
30
+ if (regHeightM !== void 0) {
31
+ if (regHeightM > verticalOffsetM) throw new RangeError("\u5B9A\u4F4D\u70B9\u9AD8\u5EA6 y_d \u5E94\u4E0D\u5927\u4E8E\u5E95\u5EA7\u7AD6\u76F4\u8DDD h");
32
+ regulatorPosM = regHeightM / verticalOffsetM * fullLengthM;
33
+ }
34
+ return { fullLengthM, cutLengthM, regulatorPosM, toleranceMM: ASSEMBLY_TOLERANCE_MM };
35
+ }
36
+
37
+ export {
38
+ cantileverMeta,
39
+ ASSEMBLY_TOLERANCE_MM,
40
+ cantileverCut
41
+ };
42
+ //# sourceMappingURL=chunk-HZWNKKIB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cantilever/meta.ts","../src/cantilever/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const cantileverMeta: CalculatorMeta = {\n name: '腕臂预配(斜腕臂勾股下料)',\n nameEn: 'Cantilever Pre-assembly (Pythagorean)',\n summary: '按勾股几何计算斜腕臂下料长度与定位环安装位置,附 TB 10758 预配允差。',\n formula: [\n '斜腕臂管长 L = √(h²+d²) − Δc',\n '定位环位置 s = (y_d/h)·√(h²+d²)',\n '预配允差 ±5 mm(TB 10758-2018 第 5.10.1 条);安装允差 ±20 mm(第 5.10.2 条)',\n ],\n references: [\n '勾股几何为平面几何恒等式(几何自证)',\n 'TB 10758-2018 第 5.10.1/5.10.2 条(预配/安装允差分离)',\n '端部扣减 Δc 按 TB/T 2075 系列零件尺寸',\n ],\n scope: ['竖直距 h:0.8~4 m', '水平投影 d:0.3~4 m', '端部扣减:0~0.6 m'],\n disclaimer: '本工具结果仅供参考,实际预配以线路装配图与零件实物尺寸为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/cantilever/',\n};\n","export { cantileverMeta } from './meta';\n\n/** 腕臂预配安装偏差(TB 10758-2018 第 5.10.1 条),mm */\nexport const ASSEMBLY_TOLERANCE_MM = 5;\n\n/** 斜腕臂勾股下料计算输入。单位:m。 */\nexport interface CantileverInput {\n /** 上下底座竖直距 h,m */\n readonly verticalOffsetM: number;\n /** 下底座至定位点水平投影 d,m */\n readonly horizontalProjectionM: number;\n /** 端部零件扣减 Δc,m */\n readonly endDeductionM?: number;\n /** 定位点至下底座竖直距 y_d,m */\n readonly regHeightM?: number;\n}\n\nexport interface CantileverResult {\n /** 理论斜长 √(h²+d²),m */\n readonly fullLengthM: number;\n /** 下料长度 L = √(h²+d²) − Δc,m */\n readonly cutLengthM: number;\n /** 定位环安装位置 s = (y_d/h)·√(h²+d²),m */\n readonly regulatorPosM: number | null;\n /** 安装允差,mm */\n readonly toleranceMM: number;\n}\n\n/** 斜腕臂勾股下料(几何自证) */\nexport function cantileverCut(input: CantileverInput): CantileverResult {\n const { verticalOffsetM, horizontalProjectionM, endDeductionM, regHeightM } = input;\n if (!(verticalOffsetM > 0)) throw new RangeError('竖直距必须为正,收到 ' + verticalOffsetM + ' m');\n if (!(horizontalProjectionM > 0)) throw new RangeError('水平投影必须为正,收到 ' + horizontalProjectionM + ' m');\n const fullLengthM = Math.sqrt(verticalOffsetM * verticalOffsetM + horizontalProjectionM * horizontalProjectionM);\n const cutLengthM = fullLengthM - (endDeductionM ?? 0);\n let regulatorPosM: number | null = null;\n if (regHeightM !== undefined) {\n if (regHeightM > verticalOffsetM) throw new RangeError('定位点高度 y_d 应不大于底座竖直距 h');\n regulatorPosM = (regHeightM / verticalOffsetM) * fullLengthM;\n }\n return { fullLengthM, cutLengthM, regulatorPosM, toleranceMM: ASSEMBLY_TOLERANCE_MM };\n}\n"],"mappings":";AAEO,IAAM,iBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO,CAAC,qCAAiB,2CAAkB,uCAAc;AAAA,EACzD,YAAY;AAAA,EACZ,QAAQ;AACV;;;AChBO,IAAM,wBAAwB;AA0B9B,SAAS,cAAc,OAA0C;AACtE,QAAM,EAAE,iBAAiB,uBAAuB,eAAe,WAAW,IAAI;AAC9E,MAAI,EAAE,kBAAkB,GAAI,OAAM,IAAI,WAAW,kEAAgB,kBAAkB,IAAI;AACvF,MAAI,EAAE,wBAAwB,GAAI,OAAM,IAAI,WAAW,wEAAiB,wBAAwB,IAAI;AACpG,QAAM,cAAc,KAAK,KAAK,kBAAkB,kBAAkB,wBAAwB,qBAAqB;AAC/G,QAAM,aAAa,eAAe,iBAAiB;AACnD,MAAI,gBAA+B;AACnC,MAAI,eAAe,QAAW;AAC5B,QAAI,aAAa,gBAAiB,OAAM,IAAI,WAAW,6FAAuB;AAC9E,oBAAiB,aAAa,kBAAmB;AAAA,EACnD;AACA,SAAO,EAAE,aAAa,YAAY,eAAe,aAAa,sBAAsB;AACtF;","names":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/creepage/meta.ts
2
+ var creepageMeta = {
3
+ name: "\u7EDD\u7F18\u5B50\u722C\u7535\u8DDD\u79BB\u9009\u578B\u6821\u6838",
4
+ nameEn: "Insulator Creepage Distance Check",
5
+ summary: "\u6309 TB 10009-2016 \u7B2C 5.3.2 \u6761\u5E95\u7EBF\u5224\u5B9A\u63A5\u89E6\u7F51\u7EDD\u7F18\u6700\u5C0F\u722C\u7535\u8DDD\u79BB\uFF0C\u9644 GB/T 32586 \u6BD4\u8DDD\u4E09\u6863\u5BF9\u7167\u3002",
6
+ formula: [
7
+ "\u5E95\u7EBF\uFF1A\u4E00\u822C\u533A\u6BB5 \u22651400 mm\uFF1BV \u5F62\u5929\u7A97\u4E0A\u3001\u4E0B\u884C\u6B63\u7EBF\u95F4\u5206\u6BB5\u4E32 \u22651600 mm",
8
+ "GB/T 32586 \u7EDF\u4E00\u722C\u7535\u6BD4\u8DDD\u4E09\u6863\uFF1A\u6B63\u5E38 24~33\u3001\u975E\u6B63\u5E38 36~40\u3001\u82DB\u523B >48 mm/kV"
9
+ ],
10
+ references: [
11
+ "TB 10009-2016 \u7B2C 5.3.2 \u6761\u7B2C 1 \u6B3E\uFF08\u7EDD\u5BF9\u5E95\u7EBF\uFF09",
12
+ "GB/T 32586-2016 \u7B2C 4.4 \u6761\uFF08\u7EDF\u4E00\u722C\u7535\u6BD4\u8DDD\u4E09\u6863\uFF0C\u6309\u7CFB\u7EDF\u6700\u9AD8\u6301\u7EED\u7535\u538B\u6298\u7B97\uFF09",
13
+ "\u94C1\u8DEF\u4F53\u7CFB\u4EE5\u7EDD\u5BF9\u503C\u95E8\u69DB\u5224\u5B9A\uFF0C\u6BD4\u8DDD\u6CD5\u4EC5\u4F5C\u5BF9\u7167"
14
+ ],
15
+ scope: ["\u722C\u7535\u8DDD\u79BB\uFF1A600~2500 mm", "\u7CFB\u7EDF\u6700\u9AD8\u7535\u538B\uFF1A27.5~31 kV"],
16
+ 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",
17
+ online: "https://www.itswe.com/calculator/creepage/"
18
+ };
19
+
20
+ // src/creepage/index.ts
21
+ var CREEPAGE_FLOOR_GENERAL = 1400;
22
+ var CREEPAGE_FLOOR_VCUT = 1600;
23
+ var USCD_BANDS = [
24
+ { label: "\u6B63\u5E38", min: 24, max: 33 },
25
+ { label: "\u975E\u6B63\u5E38", min: 36, max: 40 },
26
+ { label: "\u82DB\u523B", min: 48, max: Infinity }
27
+ ];
28
+ function creepageCheck(input) {
29
+ const floorMM = input.scenario === "vcut" ? CREEPAGE_FLOOR_VCUT : CREEPAGE_FLOOR_GENERAL;
30
+ const kv = _nullishCoalesce(input.maxVoltageKV, () => ( 29));
31
+ const uscdBands = USCD_BANDS.map((b) => ({
32
+ label: b.label,
33
+ mm: b.max === Infinity ? Math.round(b.min * kv) : Math.round(b.min * kv)
34
+ }));
35
+ return { floorMM, passes: input.creepageMM >= floorMM, uscdBands };
36
+ }
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+ exports.creepageMeta = creepageMeta; exports.CREEPAGE_FLOOR_GENERAL = CREEPAGE_FLOOR_GENERAL; exports.CREEPAGE_FLOOR_VCUT = CREEPAGE_FLOOR_VCUT; exports.USCD_BANDS = USCD_BANDS; exports.creepageCheck = creepageCheck;
45
+ //# sourceMappingURL=chunk-LBGUOTCJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-LBGUOTCJ.cjs","../src/creepage/meta.ts","../src/creepage/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,aAAA,EAA+B;AAAA,EAC1C,IAAA,EAAM,oEAAA;AAAA,EACN,MAAA,EAAQ,mCAAA;AAAA,EACR,OAAA,EAAS,sMAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,8JAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,sFAAA;AAAA,IACA,uKAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,2CAAA,EAAoB,sDAAmB,CAAA;AAAA,EAC/C,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AEhBO,IAAM,uBAAA,EAAyB,IAAA;AAE/B,IAAM,oBAAA,EAAsB,IAAA;AAG5B,IAAM,WAAA,EAAa;AAAA,EACxB,EAAE,KAAA,EAAO,cAAA,EAAM,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,GAAG,CAAA;AAAA,EAChC,EAAE,KAAA,EAAO,oBAAA,EAAO,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,GAAG,CAAA;AAAA,EACjC,EAAE,KAAA,EAAO,cAAA,EAAM,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,SAAS;AACxC,CAAA;AAGO,SAAS,aAAA,CAAc,KAAA,EAS5B;AACA,EAAA,MAAM,QAAA,EAAW,KAAA,CAAM,SAAA,IAAa,OAAA,EAAS,oBAAA,EAAsB,sBAAA;AACnE,EAAA,MAAM,GAAA,mBAAK,KAAA,CAAM,YAAA,UAAgB,IAAA;AACjC,EAAA,MAAM,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAA,GAAA,CAAO;AAAA,IACvC,KAAA,EAAO,CAAA,CAAE,KAAA;AAAA,IACT,EAAA,EAAI,CAAA,CAAE,IAAA,IAAQ,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE;AAAA,EACzE,CAAA,CAAE,CAAA;AACF,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,CAAM,WAAA,GAAc,OAAA,EAAS,UAAU,CAAA;AACnE;AFIA;AACA;AACE;AACA;AACA;AACA;AACA;AACF,wNAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-LBGUOTCJ.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const creepageMeta: CalculatorMeta = {\n name: '绝缘子爬电距离选型校核',\n nameEn: 'Insulator Creepage Distance Check',\n summary: '按 TB 10009-2016 第 5.3.2 条底线判定接触网绝缘最小爬电距离,附 GB/T 32586 比距三档对照。',\n formula: [\n '底线:一般区段 ≥1400 mm;V 形天窗上、下行正线间分段串 ≥1600 mm',\n 'GB/T 32586 统一爬电比距三档:正常 24~33、非正常 36~40、苛刻 >48 mm/kV',\n ],\n references: [\n 'TB 10009-2016 第 5.3.2 条第 1 款(绝对底线)',\n 'GB/T 32586-2016 第 4.4 条(统一爬电比距三档,按系统最高持续电压折算)',\n '铁路体系以绝对值门槛判定,比距法仅作对照',\n ],\n scope: ['爬电距离:600~2500 mm', '系统最高电压:27.5~31 kV'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/creepage/',\n};\n","export { creepageMeta } from './meta';\n\n/** 接触网绝缘爬电距离底线(TB 10009-2016 第 5.3.2 条第 1 款),mm */\nexport const CREEPAGE_FLOOR_GENERAL = 1400;\n/** V 形天窗区段上、下行正线间分段绝缘子串底线,mm */\nexport const CREEPAGE_FLOOR_VCUT = 1600;\n\n/** GB/T 32586 统一爬电比距三档(第 4.4 条,按系统最高持续电压折算) */\nexport const USCD_BANDS = [\n { label: '正常', min: 24, max: 33 },\n { label: '非正常', min: 36, max: 40 },\n { label: '苛刻', min: 48, max: Infinity },\n] as const;\n\n/** 爬电距离校核 */\nexport function creepageCheck(input: {\n /** 绝缘子实际爬电距离,mm */\n readonly creepageMM: number;\n /** 使用场景:'general' 一般 | 'vcut' V 形天窗分段串 */\n readonly scenario?: 'general' | 'vcut';\n /** 系统最高电压,kV(GB/T 32586 折算用,默认 29) */\n readonly maxVoltageKV?: number;\n}): {\n floorMM: number; passes: boolean; uscdBands: { label: string; mm: number }[];\n} {\n const floorMM = (input.scenario === 'vcut' ? CREEPAGE_FLOOR_VCUT : CREEPAGE_FLOOR_GENERAL);\n const kv = input.maxVoltageKV ?? 29;\n const uscdBands = USCD_BANDS.map((b) => ({\n label: b.label,\n mm: b.max === Infinity ? Math.round(b.min * kv) : Math.round(b.min * kv),\n }));\n return { floorMM, passes: input.creepageMM >= floorMM, uscdBands };\n}\n"]}