ocs-calculators 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -10
- package/dist/anchor-length/index.cjs +11 -0
- package/dist/anchor-length/index.cjs.map +1 -0
- package/dist/anchor-length/index.d.cts +45 -0
- package/dist/anchor-length/index.d.ts +45 -0
- package/dist/anchor-length/index.js +11 -0
- package/dist/anchor-length/index.js.map +1 -0
- package/dist/bvalue/index.cjs +9 -0
- package/dist/bvalue/index.cjs.map +1 -0
- package/dist/bvalue/index.d.cts +35 -0
- package/dist/bvalue/index.d.ts +35 -0
- package/dist/bvalue/index.js +9 -0
- package/dist/bvalue/index.js.map +1 -0
- package/dist/cantilever/index.cjs +11 -0
- package/dist/cantilever/index.cjs.map +1 -0
- package/dist/cantilever/index.d.cts +31 -0
- package/dist/cantilever/index.d.ts +31 -0
- package/dist/cantilever/index.js +11 -0
- package/dist/cantilever/index.js.map +1 -0
- package/dist/chunk-3GREMF76.js +44 -0
- package/dist/chunk-3GREMF76.js.map +1 -0
- package/dist/chunk-4344WWAF.cjs +58 -0
- package/dist/chunk-4344WWAF.cjs.map +1 -0
- package/dist/chunk-57J7I6JA.cjs +116 -0
- package/dist/chunk-57J7I6JA.cjs.map +1 -0
- package/dist/chunk-75EGROQB.js +53 -0
- package/dist/chunk-75EGROQB.js.map +1 -0
- package/dist/chunk-C2XU3XKP.js +46 -0
- package/dist/chunk-C2XU3XKP.js.map +1 -0
- package/dist/chunk-CLVLOLUJ.js +45 -0
- package/dist/chunk-CLVLOLUJ.js.map +1 -0
- package/dist/chunk-CSLI5HEJ.cjs +53 -0
- package/dist/chunk-CSLI5HEJ.cjs.map +1 -0
- package/dist/chunk-D5F5ES2R.js +163 -0
- package/dist/chunk-D5F5ES2R.js.map +1 -0
- package/dist/chunk-HXALVJ4G.cjs +44 -0
- package/dist/chunk-HXALVJ4G.cjs.map +1 -0
- package/dist/chunk-HZWNKKIB.js +42 -0
- package/dist/chunk-HZWNKKIB.js.map +1 -0
- package/dist/chunk-LBGUOTCJ.cjs +45 -0
- package/dist/chunk-LBGUOTCJ.cjs.map +1 -0
- package/dist/chunk-PYNVEHGR.cjs +46 -0
- package/dist/chunk-PYNVEHGR.cjs.map +1 -0
- package/dist/chunk-TO46PTS3.js +116 -0
- package/dist/chunk-TO46PTS3.js.map +1 -0
- package/dist/chunk-VXVTT6WS.js +58 -0
- package/dist/chunk-VXVTT6WS.js.map +1 -0
- package/dist/chunk-WGTOBRYV.cjs +42 -0
- package/dist/chunk-WGTOBRYV.cjs.map +1 -0
- package/dist/chunk-X25CXRVE.cjs +163 -0
- package/dist/chunk-X25CXRVE.cjs.map +1 -0
- package/dist/creepage/index.cjs +15 -0
- package/dist/creepage/index.cjs.map +1 -0
- package/dist/creepage/index.d.cts +40 -0
- package/dist/creepage/index.d.ts +40 -0
- package/dist/creepage/index.js +15 -0
- package/dist/creepage/index.js.map +1 -0
- package/dist/cross-span/index.cjs +9 -0
- package/dist/cross-span/index.cjs.map +1 -0
- package/dist/cross-span/index.d.cts +68 -0
- package/dist/cross-span/index.d.ts +68 -0
- package/dist/cross-span/index.js +9 -0
- package/dist/cross-span/index.js.map +1 -0
- package/dist/index.cjs +77 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +86 -18
- package/dist/index.js.map +1 -1
- package/dist/pole-capacity/index.cjs +13 -0
- package/dist/pole-capacity/index.cjs.map +1 -0
- package/dist/pole-capacity/index.d.cts +47 -0
- package/dist/pole-capacity/index.d.ts +47 -0
- package/dist/pole-capacity/index.js +13 -0
- package/dist/pole-capacity/index.js.map +1 -0
- package/dist/sag/index.cjs +13 -0
- package/dist/sag/index.cjs.map +1 -0
- package/dist/sag/index.d.cts +21 -0
- package/dist/sag/index.d.ts +21 -0
- package/dist/sag/index.js +13 -0
- package/dist/sag/index.js.map +1 -0
- package/dist/steady-arm/index.cjs +11 -0
- package/dist/steady-arm/index.cjs.map +1 -0
- package/dist/steady-arm/index.d.cts +66 -0
- package/dist/steady-arm/index.d.ts +66 -0
- package/dist/steady-arm/index.js +11 -0
- package/dist/steady-arm/index.js.map +1 -0
- package/package.json +43 -3
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// 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
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
exports.sagMeta = sagMeta; exports.sagMM = sagMM; exports.tensionFromSagKN = tensionFromSagKN; exports.maxSpanFromSagM = maxSpanFromSagM;
|
|
46
|
+
//# sourceMappingURL=chunk-PYNVEHGR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-PYNVEHGR.cjs","../src/sag/meta.ts","../src/sag/index.ts"],"names":["sagMM"],"mappings":"AAAA;ACEO,IAAM,QAAA,EAA0B;AAAA,EACrC,IAAA,EAAM,2EAAA;AAAA,EACN,MAAA,EAAQ,uBAAA;AAAA,EACR,OAAA,EAAS,sLAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,kCAAA;AAAA,IACA,kDAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,oQAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,6BAAA,EAAgB,4BAAA,EAAe,oCAAgB,CAAA;AAAA,EACvD,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AENO,SAAS,KAAA,CAAM,KAAA,EAAyB;AAC7C,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,EAAA,EAAI,KAAA;AAC1C,EAAA,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,0DAAA,EAAe,UAAA,EAAY,KAAK,CAAA;AAC3E,EAAA,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,0DAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AAClE,EAAA,GAAA,CAAI,CAAA,CAAE,YAAA,GAAe,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,gEAAA,EAAgB,YAAA,EAAc,MAAM,CAAA;AAClF,EAAA,MAAM,KAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAA,CAAU,EAAA,EAAI,UAAA,EAAY,GAAA,CAAA;AAC9D,EAAA,OAAO,KAAA,EAAO,GAAA;AAChB;AAGO,SAAS,gBAAA,CAAiB,WAAA,EAAqB,KAAA,EAAeA,MAAAA,EAAuB;AAC1F,EAAA,GAAA,CAAI,CAAA,CAAEA,OAAAA,EAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,0DAAA,EAAeA,OAAAA,EAAQ,KAAK,CAAA;AACnE,EAAA,MAAM,KAAA,EAAOA,OAAAA,EAAQ,GAAA;AACrB,EAAA,OAAQ,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAA,CAAU,EAAA,EAAI,IAAA,EAAA,EAAQ,GAAA;AACtD;AAGO,SAAS,eAAA,CAAgB,WAAA,EAAqB,SAAA,EAAmB,UAAA,EAA4B;AAClG,EAAA,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,sEAAA,EAAiB,WAAA,EAAa,KAAK,CAAA;AAC/E,EAAA,MAAM,KAAA,EAAO,WAAA,EAAa,GAAA;AAC1B,EAAA,OAAO,IAAA,CAAK,IAAA,CAAM,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,KAAA,EAAQ,WAAW,CAAA;AAC7D;AFIA;AACA;AACE;AACA;AACA;AACA;AACF,yIAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-PYNVEHGR.cjs","sourcesContent":[null,"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"]}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/steady-arm/meta.ts
|
|
2
|
+
var steadyArmMeta = {
|
|
3
|
+
name: "\u5B9A\u4F4D\u5668\u5761\u5EA6\u6821\u6838",
|
|
4
|
+
nameEn: "Steady Arm Slope Check",
|
|
5
|
+
summary: "\u8BA1\u7B97\u5B9A\u4F4D\u5668\u6240\u53D7\u6C34\u5E73\u529B\uFF08\u76F4\u7EBF\u4E4B\u5B57\u529B / \u66F2\u7EBF\u529B\uFF09\u4E0E\u5782\u76F4\u529B\uFF0C\u6C42\u5761\u5EA6\u89D2\u4E0E\u5761\u5EA6\u6BD4\uFF0C\u5E76\u6309\u76F4\u7EBF/\u66F2\u7EBF\u9650\u503C\u5224\u5B9A\u662F\u5426\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u76F4\u7EBF\u4E4B\u5B57\u529B\uFF1AFz = 4\xB7T\xB7a/l\uFF08a \u4E3A\u62C9\u51FA\u503C\uFF0Cmm \u6362\u7B97 m\uFF09",
|
|
8
|
+
"\u66F2\u7EBF\u529B\uFF1AFq = T\xB7l/R",
|
|
9
|
+
"\u66F2\u7EBF\u5408\u6210\uFF1AFs = |Fq \u2212 Fz|\uFF1B\u76F4\u7EBF\u533A\u6BB5 Fs = Fz",
|
|
10
|
+
"\u5782\u76F4\u529B\uFF1AFc = g_j\xB7l\u2081 + G_d",
|
|
11
|
+
"\u5761\u5EA6\u89D2\uFF1A\u03B8 = atan(Fc/Fs)\uFF0C\u5F27\u5EA6\u8F6C\u5EA6",
|
|
12
|
+
"\u5761\u5EA6\u6BD4\uFF08\u5782\u76F4\u2236\u6C34\u5E73\uFF09= 1\u2236n\uFF0Cn = Fs/Fc",
|
|
13
|
+
"\u9650\u503C\uFF08\u76F4\u7EBF \u03B8 \u2265 8\xB0\uFF1B\u66F2\u7EBF 6\xB0 \u2264 \u03B8 \u2264 16\xB0\uFF09"
|
|
14
|
+
],
|
|
15
|
+
references: [
|
|
16
|
+
"\u6559\u6750\u901A\u884C\u8FD1\u4F3C\uFF1A\u4E4B\u5B57\u529B Fz = 4\xB7T\xB7a/l\u3001\u66F2\u7EBF\u529B Fq = T\xB7l/R",
|
|
17
|
+
"\u7F57\u5065\u7B49\u300A\u9AD8\u901F\u94C1\u8DEF\u63A5\u89E6\u7F51\u5B9A\u4F4D\u5668\u5761\u5EA6\u95EE\u9898\u7684\u6DF1\u5316\u7814\u7A76\u300B\uFF0C\u94C1\u9053\u5DE5\u7A0B\u5B66\u62A5 2013, 30(1): 76-80\uFF08300 km/h \u53CA\u4EE5\u4E0A\u5761\u5EA6\u9650\u503C\u53E3\u5F84\uFF09",
|
|
18
|
+
"\u5728\u7EBF\u53C2\u8003\uFF1Ahttps://www.itswe.com/calculator/steady-arm/"
|
|
19
|
+
],
|
|
20
|
+
scope: [
|
|
21
|
+
"\u63A5\u89E6\u7EBF\u5F20\u529B T\uFF1A1 ~ 40 kN",
|
|
22
|
+
"\u62C9\u51FA\u503C a\uFF1A50 ~ 500 mm",
|
|
23
|
+
"\u8DE8\u8DDD l\uFF1A5 ~ 80 m",
|
|
24
|
+
"\u66F2\u7EBF\u534A\u5F84 R\uFF1A500 ~ 12000 m\uFF08undefined \u8868\u793A\u76F4\u7EBF\uFF09",
|
|
25
|
+
"\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD g_j\uFF1A0.001 ~ 0.1 kN/m",
|
|
26
|
+
"\u5B9A\u4F4D\u5668\u81EA\u91CD G_d\uFF1A0 ~ 0.5 kN",
|
|
27
|
+
"\u9650\u503C\u9002\u7528\u4E8E 300 km/h \u53CA\u4EE5\u4E0A\u9AD8\u94C1\uFF1B\u4E2D\u4F4E\u901F\u7EBF\u8DEF\u5761\u5EA6\u9650\u503C\u53EF\u4E0D\u540C",
|
|
28
|
+
"\u672A\u8BA1\u5165\u98CE\u8377\u8F7D\u3001\u5B9A\u4F4D\u5668\u957F\u5EA6\u65B9\u5411\u503E\u659C\u4E0E\u96F6\u90E8\u4EF6\u516C\u5DEE"
|
|
29
|
+
],
|
|
30
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
31
|
+
online: "https://www.itswe.com/calculator/steady-arm/"
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// src/steady-arm/index.ts
|
|
35
|
+
function steadyArmAngleDeg(input) {
|
|
36
|
+
const {
|
|
37
|
+
contactWireTensionKN: T,
|
|
38
|
+
staggerMM,
|
|
39
|
+
spanM: l,
|
|
40
|
+
curveRadiusM,
|
|
41
|
+
firstDropperOffsetM: l1,
|
|
42
|
+
wireWeightKNPerM: gJ,
|
|
43
|
+
regulatorSelfWeightKN: gD
|
|
44
|
+
} = input;
|
|
45
|
+
if (!(T > 0)) {
|
|
46
|
+
throw new RangeError(`\u63A5\u89E6\u7EBF\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${T} kN`);
|
|
47
|
+
}
|
|
48
|
+
if (!(staggerMM > 0)) {
|
|
49
|
+
throw new RangeError(`\u62C9\u51FA\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${staggerMM} mm`);
|
|
50
|
+
}
|
|
51
|
+
if (!(l > 0)) {
|
|
52
|
+
throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${l} m`);
|
|
53
|
+
}
|
|
54
|
+
if (curveRadiusM !== void 0 && !(curveRadiusM > 0)) {
|
|
55
|
+
throw new RangeError(`\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${curveRadiusM} m`);
|
|
56
|
+
}
|
|
57
|
+
if (!(l1 >= 0)) {
|
|
58
|
+
throw new RangeError(`\u7B2C\u4E00\u540A\u5F26\u8DDD\u5B9A\u4F4D\u70B9\u8DDD\u79BB\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${l1} m`);
|
|
59
|
+
}
|
|
60
|
+
if (!(gJ >= 0)) {
|
|
61
|
+
throw new RangeError(`\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${gJ} kN/m`);
|
|
62
|
+
}
|
|
63
|
+
if (!(gD >= 0)) {
|
|
64
|
+
throw new RangeError(`\u5B9A\u4F4D\u5668\u81EA\u91CD\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${gD} kN`);
|
|
65
|
+
}
|
|
66
|
+
const isStraight = curveRadiusM === void 0;
|
|
67
|
+
const aM = staggerMM * 1e-3;
|
|
68
|
+
const fz = 4 * T * aM / l;
|
|
69
|
+
let fq = 0;
|
|
70
|
+
let fs = fz;
|
|
71
|
+
if (!isStraight) {
|
|
72
|
+
const R = curveRadiusM;
|
|
73
|
+
fq = T * l / R;
|
|
74
|
+
fs = Math.abs(fq - fz);
|
|
75
|
+
}
|
|
76
|
+
const fc = gJ * l1 + gD;
|
|
77
|
+
if (!(fs > 0)) {
|
|
78
|
+
throw new RangeError(
|
|
79
|
+
`\u6C34\u5E73\u5408\u6210\u529B Fs = ${fs} kN \u987B\u4E3A\u6B63\u6570\uFF08\u66F2\u7EBF\u529B\u4E0E\u4E4B\u5B57\u529B\u76F8\u7B49\u65F6\u5761\u5EA6\u65E0\u610F\u4E49\uFF09\uFF0C\u8BF7\u590D\u6838\u8F93\u5165`
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
if (!(fc > 0)) {
|
|
83
|
+
throw new RangeError(
|
|
84
|
+
`\u5782\u76F4\u529B Fc = ${fc} kN \u987B\u4E3A\u6B63\u6570\uFF0C\u8BF7\u590D\u6838\u63A5\u89E6\u7EBF\u5355\u4F4D\u91CD / \u5B9A\u4F4D\u5668\u81EA\u91CD`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
const angleDeg = Math.atan(fc / fs) * 180 / Math.PI;
|
|
88
|
+
const slopeRatio = fs / fc;
|
|
89
|
+
return {
|
|
90
|
+
staggerForceKN: fz,
|
|
91
|
+
curveForceKN: fq,
|
|
92
|
+
horizontalForceKN: fs,
|
|
93
|
+
verticalForceKN: fc,
|
|
94
|
+
angleDeg,
|
|
95
|
+
slopeRatio,
|
|
96
|
+
isStraight
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function steadyArmCheck(input) {
|
|
100
|
+
const base = steadyArmAngleDeg(input);
|
|
101
|
+
if (base.isStraight) {
|
|
102
|
+
const passes2 = base.angleDeg >= 8;
|
|
103
|
+
const reason2 = passes2 ? `\u76F4\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u2265 8\xB0\uFF0C\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42` : `\u76F4\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 < 8\xB0\uFF0C\u4E0D\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42\uFF08\u9700 \u2265 8\xB0\uFF09`;
|
|
104
|
+
return { ...base, passes: passes2, reason: reason2 };
|
|
105
|
+
}
|
|
106
|
+
const passes = base.angleDeg >= 6 && base.angleDeg <= 16;
|
|
107
|
+
const reason = passes ? `\u66F2\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u4F4D\u4E8E 6\xB0 ~ 16\xB0 \u533A\u95F4\uFF0C\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42` : `\u66F2\u7EBF\u533A\u6BB5\uFF1A\u03B8 = ${base.angleDeg.toFixed(4)}\xB0 \u8D85\u51FA 6\xB0 ~ 16\xB0 \u533A\u95F4\uFF0C\u4E0D\u6EE1\u8DB3\u5761\u5EA6\u8981\u6C42`;
|
|
108
|
+
return { ...base, passes, reason };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
steadyArmMeta,
|
|
113
|
+
steadyArmAngleDeg,
|
|
114
|
+
steadyArmCheck
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=chunk-TO46PTS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/steady-arm/meta.ts","../src/steady-arm/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const steadyArmMeta: CalculatorMeta = {\n name: '定位器坡度校核',\n nameEn: 'Steady Arm Slope Check',\n summary:\n '计算定位器所受水平力(直线之字力 / 曲线力)与垂直力,求坡度角与坡度比,并按直线/曲线限值判定是否满足坡度要求。',\n formula: [\n '直线之字力:Fz = 4·T·a/l(a 为拉出值,mm 换算 m)',\n '曲线力:Fq = T·l/R',\n '曲线合成:Fs = |Fq − Fz|;直线区段 Fs = Fz',\n '垂直力:Fc = g_j·l₁ + G_d',\n '坡度角:θ = atan(Fc/Fs),弧度转度',\n '坡度比(垂直∶水平)= 1∶n,n = Fs/Fc',\n '限值(直线 θ ≥ 8°;曲线 6° ≤ θ ≤ 16°)',\n ],\n references: [\n '教材通行近似:之字力 Fz = 4·T·a/l、曲线力 Fq = T·l/R',\n '罗健等《高速铁路接触网定位器坡度问题的深化研究》,铁道工程学报 2013, 30(1): 76-80(300 km/h 及以上坡度限值口径)',\n '在线参考:https://www.itswe.com/calculator/steady-arm/',\n ],\n scope: [\n '接触线张力 T:1 ~ 40 kN',\n '拉出值 a:50 ~ 500 mm',\n '跨距 l:5 ~ 80 m',\n '曲线半径 R:500 ~ 12000 m(undefined 表示直线)',\n '接触线单位重 g_j:0.001 ~ 0.1 kN/m',\n '定位器自重 G_d:0 ~ 0.5 kN',\n '限值适用于 300 km/h 及以上高铁;中低速线路坡度限值可不同',\n '未计入风荷载、定位器长度方向倾斜与零部件公差',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/steady-arm/',\n};\n","export { steadyArmMeta } from './meta';\n\n/** 定位器坡度校核的输入参数 */\nexport interface SteadyArmInput {\n /** 接触线张力 T,kN */\n readonly contactWireTensionKN: number;\n /** 拉出值 a,mm(内部换算 m) */\n readonly staggerMM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 曲线半径 R,m。undefined 表示直线区段 */\n readonly curveRadiusM?: number;\n /** 第一吊弦距定位点距离 l₁,m */\n readonly firstDropperOffsetM: number;\n /** 接触线单位重 g_j,kN/m */\n readonly wireWeightKNPerM: number;\n /** 定位器自重 G_d,kN */\n readonly regulatorSelfWeightKN: number;\n}\n\n/** 定位器受力与坡度角计算结果 */\nexport interface SteadyArmAngleResult {\n /** 直线之字力 Fz,kN */\n readonly staggerForceKN: number;\n /** 曲线力 Fq,kN(直线区段为 0) */\n readonly curveForceKN: number;\n /** 水平合成力 Fs,kN(直线为 Fz;曲线为 |Fq − Fz|) */\n readonly horizontalForceKN: number;\n /** 垂直力 Fc,kN */\n readonly verticalForceKN: number;\n /** 坡度角 θ = atan(Fc/Fs),度 */\n readonly angleDeg: number;\n /** 坡度比(垂直∶水平)= 1∶n,n = Fs/Fc */\n readonly slopeRatio: number;\n /** 是否为直线区段 */\n readonly isStraight: boolean;\n}\n\n/** 定位器坡度校核结果 */\nexport interface SteadyArmCheckResult extends SteadyArmAngleResult {\n /** 是否满足限值要求 */\n readonly passes: boolean;\n /** 判定理由 */\n readonly reason: string;\n}\n\n/**\n * 定位器坡度计算(纯函数):\n * Fz = 4·T·a/l (直线之字力,a 由 mm 换算 m)\n * Fq = T·l/R (曲线力)\n * Fs = |Fq − Fz| (曲线合成,直线时 Fs = Fz)\n * Fc = g_j·l₁ + G_d (垂直力)\n * θ = atan(Fc/Fs) (坡度角,弧度转度)\n * n = Fs/Fc (坡度比 1∶n)\n */\nexport function steadyArmAngleDeg(input: SteadyArmInput): SteadyArmAngleResult {\n const {\n contactWireTensionKN: T,\n staggerMM,\n spanM: l,\n curveRadiusM,\n firstDropperOffsetM: l1,\n wireWeightKNPerM: gJ,\n regulatorSelfWeightKN: gD,\n } = input;\n\n if (!(T > 0)) {\n throw new RangeError(`接触线张力必须为正数,收到 ${T} kN`);\n }\n if (!(staggerMM > 0)) {\n throw new RangeError(`拉出值必须为正数,收到 ${staggerMM} mm`);\n }\n if (!(l > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${l} m`);\n }\n if (curveRadiusM !== undefined && !(curveRadiusM > 0)) {\n throw new RangeError(`曲线半径必须为正数,收到 ${curveRadiusM} m`);\n }\n if (!(l1 >= 0)) {\n throw new RangeError(`第一吊弦距定位点距离不能为负,收到 ${l1} m`);\n }\n if (!(gJ >= 0)) {\n throw new RangeError(`接触线单位重不能为负,收到 ${gJ} kN/m`);\n }\n if (!(gD >= 0)) {\n throw new RangeError(`定位器自重不能为负,收到 ${gD} kN`);\n }\n\n const isStraight = curveRadiusM === undefined;\n\n const aM = staggerMM * 1e-3;\n const fz = (4 * T * aM) / l;\n\n let fq = 0;\n let fs = fz;\n if (!isStraight) {\n const R = curveRadiusM as number;\n fq = (T * l) / R;\n fs = Math.abs(fq - fz);\n }\n\n const fc = gJ * l1 + gD;\n\n if (!(fs > 0)) {\n throw new RangeError(\n `水平合成力 Fs = ${fs} kN 须为正数(曲线力与之字力相等时坡度无意义),请复核输入`,\n );\n }\n if (!(fc > 0)) {\n throw new RangeError(\n `垂直力 Fc = ${fc} kN 须为正数,请复核接触线单位重 / 定位器自重`,\n );\n }\n\n const angleDeg = (Math.atan(fc / fs) * 180) / Math.PI;\n const slopeRatio = fs / fc;\n\n return {\n staggerForceKN: fz,\n curveForceKN: fq,\n horizontalForceKN: fs,\n verticalForceKN: fc,\n angleDeg,\n slopeRatio,\n isStraight,\n };\n}\n\n/**\n * 定位器坡度限值校核。\n *\n * 限值(300 km/h 及以上高铁期刊口径,罗健等《高速铁路接触网定位器坡度问题的深化研究》,\n * 铁道工程学报 2013,30(1):76-80):\n * - 直线区段:θ ≥ 8°\n * - 曲线区段:6° ≤ θ ≤ 16°\n */\nexport function steadyArmCheck(input: SteadyArmInput): SteadyArmCheckResult {\n const base = steadyArmAngleDeg(input);\n\n if (base.isStraight) {\n const passes = base.angleDeg >= 8;\n const reason = passes\n ? `直线区段:θ = ${base.angleDeg.toFixed(4)}° ≥ 8°,满足坡度要求`\n : `直线区段:θ = ${base.angleDeg.toFixed(4)}° < 8°,不满足坡度要求(需 ≥ 8°)`;\n return { ...base, passes, reason };\n }\n\n const passes = base.angleDeg >= 6 && base.angleDeg <= 16;\n const reason = passes\n ? `曲线区段:θ = ${base.angleDeg.toFixed(4)}° 位于 6° ~ 16° 区间,满足坡度要求`\n : `曲线区段:θ = ${base.angleDeg.toFixed(4)}° 超出 6° ~ 16° 区间,不满足坡度要求`;\n return { ...base, passes, reason };\n}\n"],"mappings":";AAEO,IAAM,gBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SACE;AAAA,EACF,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;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;;;ACsBO,SAAS,kBAAkB,OAA6C;AAC7E,QAAM;AAAA,IACJ,sBAAsB;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,EACzB,IAAI;AAEJ,MAAI,EAAE,IAAI,IAAI;AACZ,UAAM,IAAI,WAAW,kFAAiB,CAAC,KAAK;AAAA,EAC9C;AACA,MAAI,EAAE,YAAY,IAAI;AACpB,UAAM,IAAI,WAAW,sEAAe,SAAS,KAAK;AAAA,EACpD;AACA,MAAI,EAAE,IAAI,IAAI;AACZ,UAAM,IAAI,WAAW,gEAAc,CAAC,IAAI;AAAA,EAC1C;AACA,MAAI,iBAAiB,UAAa,EAAE,eAAe,IAAI;AACrD,UAAM,IAAI,WAAW,4EAAgB,YAAY,IAAI;AAAA,EACvD;AACA,MAAI,EAAE,MAAM,IAAI;AACd,UAAM,IAAI,WAAW,0GAAqB,EAAE,IAAI;AAAA,EAClD;AACA,MAAI,EAAE,MAAM,IAAI;AACd,UAAM,IAAI,WAAW,kFAAiB,EAAE,OAAO;AAAA,EACjD;AACA,MAAI,EAAE,MAAM,IAAI;AACd,UAAM,IAAI,WAAW,4EAAgB,EAAE,KAAK;AAAA,EAC9C;AAEA,QAAM,aAAa,iBAAiB;AAEpC,QAAM,KAAK,YAAY;AACvB,QAAM,KAAM,IAAI,IAAI,KAAM;AAE1B,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AACV,SAAM,IAAI,IAAK;AACf,SAAK,KAAK,IAAI,KAAK,EAAE;AAAA,EACvB;AAEA,QAAM,KAAK,KAAK,KAAK;AAErB,MAAI,EAAE,KAAK,IAAI;AACb,UAAM,IAAI;AAAA,MACR,uCAAc,EAAE;AAAA,IAClB;AAAA,EACF;AACA,MAAI,EAAE,KAAK,IAAI;AACb,UAAM,IAAI;AAAA,MACR,2BAAY,EAAE;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,WAAY,KAAK,KAAK,KAAK,EAAE,IAAI,MAAO,KAAK;AACnD,QAAM,aAAa,KAAK;AAExB,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUO,SAAS,eAAe,OAA6C;AAC1E,QAAM,OAAO,kBAAkB,KAAK;AAEpC,MAAI,KAAK,YAAY;AACnB,UAAMA,UAAS,KAAK,YAAY;AAChC,UAAMC,UAASD,UACX,0CAAY,KAAK,SAAS,QAAQ,CAAC,CAAC,gEACpC,0CAAY,KAAK,SAAS,QAAQ,CAAC,CAAC;AACxC,WAAO,EAAE,GAAG,MAAM,QAAAA,SAAQ,QAAAC,QAAO;AAAA,EACnC;AAEA,QAAM,SAAS,KAAK,YAAY,KAAK,KAAK,YAAY;AACtD,QAAM,SAAS,SACX,0CAAY,KAAK,SAAS,QAAQ,CAAC,CAAC,4FACpC,0CAAY,KAAK,SAAS,QAAQ,CAAC,CAAC;AACxC,SAAO,EAAE,GAAG,MAAM,QAAQ,OAAO;AACnC;","names":["passes","reason"]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/pole-capacity/meta.ts
|
|
2
|
+
var poleCapacityMeta = {
|
|
3
|
+
name: "\u652F\u67F1\u5BB9\u91CF\u9009\u578B\u6821\u6838",
|
|
4
|
+
nameEn: "Mast Capacity Selection Check",
|
|
5
|
+
summary: "\u5BB9\u91CF\u6BD4\u8F83\u6CD5\uFF1A\u60AC\u6302\u6C34\u5E73\u529B\u4E0E\u652F\u67F1\u98CE\u8F7D\u5408\u6210\u5DE5\u4F5C\u5F2F\u77E9\uFF0C\u5BF9\u7167 GB/T 25020.1 \u94A2\u652F\u67F1\u68C0\u9A8C\u5F2F\u77E9\u7CFB\u5217\u9009\u578B\u3002",
|
|
6
|
+
formula: [
|
|
7
|
+
"\u76F4\u7EBF\u4E4B\u5B57\u529B F_z = 4(T_j+T_c)\xB7a/l\uFF1B\u66F2\u7EBF\u529B F_q = (T_j+T_c)\xB7l/R",
|
|
8
|
+
"\u5DE5\u4F5C\u5F2F\u77E9 M = F_h\xB7h_e + P\xB7b\xB7h\xB2/2 + F_wl\xB7h_e",
|
|
9
|
+
"\u627F\u8F7D\u529B\u68C0\u9A8C\u5F2F\u77E9 = 1.5 \xD7 \u6807\u79F0\u5BB9\u91CF\uFF0825020.1 \u8868 A.2 \u8868\u503C\u89C4\u5F8B\uFF09"
|
|
10
|
+
],
|
|
11
|
+
references: [
|
|
12
|
+
"\u94A2\u67F1\u76F4\u63A5\u4F9D\u636E\uFF1AGB/T 25020.1-2025 \u7B2C 5.1.1 \u6761 + \u9644\u5F55 A \u68C0\u9A8C\u5F2F\u77E9\u7CFB\u5217",
|
|
13
|
+
"\u540C\u53E3\u5F84\u6DF7\u51DD\u571F\u67F1\u6761\u6B3E\uFF1ATB/T 2286-2020 \u7B2C 5.9.2 \u6761\uFF08\u8377\u8F7D\u77E2\u91CF\u7EC4\u5408\u4E0D\u5927\u4E8E\u68C0\u9A8C\u5F2F\u77E9\uFF09",
|
|
14
|
+
"\u5206\u9879\u7CFB\u6570\u6781\u9650\u72B6\u6001\u6CD5\uFF08GB/T 32578-2016 6.3.3 \u8868 15\uFF09\u4E3A\u8BBE\u8BA1\u6B63\u5F0F\u53E3\u5F84\uFF0C\u4E0D\u53EF\u6DF7\u7528"
|
|
15
|
+
],
|
|
16
|
+
scope: ["\u5F20\u529B\uFF1A5~45 kN", "\u8DE8\u8DDD\uFF1A30~90 m", "\u98CE\u538B\uFF1A100~1500 Pa", "\u652F\u67F1\u9AD8\uFF1A5~20 m"],
|
|
17
|
+
disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
|
|
18
|
+
online: "https://www.itswe.com/calculator/pole-capacity/"
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// src/pole-capacity/index.ts
|
|
22
|
+
var STEEL_POLE_SERIES_KNM = [150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 750, 900, 1050, 1200, 1500];
|
|
23
|
+
var TEST_MOMENT_FACTOR = 1.5;
|
|
24
|
+
function poleCapacityCheck(input) {
|
|
25
|
+
const { section, contactWireTensionKN, messengerTensionKN, staggerMM, spanM, resultantHeightM, windPressurePa, poleWidthM, poleHeightM, wireWindLoadN } = input;
|
|
26
|
+
if (!(contactWireTensionKN >= 0) || !(messengerTensionKN >= 0)) throw new RangeError("\u5F20\u529B\u4E0D\u80FD\u4E3A\u8D1F");
|
|
27
|
+
const T = contactWireTensionKN + messengerTensionKN;
|
|
28
|
+
const a = staggerMM / 1e3;
|
|
29
|
+
const Fz = 4 * T * a / spanM;
|
|
30
|
+
let Fh;
|
|
31
|
+
if (section === "curve") {
|
|
32
|
+
if (!(input.curveRadiusM && input.curveRadiusM > 0)) throw new RangeError("\u66F2\u7EBF\u534A\u5F84\u5FC5\u987B\u4E3A\u6B63");
|
|
33
|
+
const Fq = T * spanM / input.curveRadiusM;
|
|
34
|
+
Fh = Math.abs(Fq - Fz);
|
|
35
|
+
} else {
|
|
36
|
+
Fh = Fz;
|
|
37
|
+
}
|
|
38
|
+
const M1 = Fh * resultantHeightM;
|
|
39
|
+
const M2 = windPressurePa * poleWidthM * Math.pow(poleHeightM, 2) / 2 / 1e3;
|
|
40
|
+
const M3 = (wireWindLoadN ?? 0) * resultantHeightM / 1e3;
|
|
41
|
+
const M = M1 + M2 + M3;
|
|
42
|
+
const nomNeed = M / TEST_MOMENT_FACTOR;
|
|
43
|
+
const pick = STEEL_POLE_SERIES_KNM.find((n) => n >= nomNeed) ?? null;
|
|
44
|
+
return {
|
|
45
|
+
horizontalForceN: Fh * 1e3,
|
|
46
|
+
workMomentKNM: M,
|
|
47
|
+
nominalNeedKNM: nomNeed,
|
|
48
|
+
selection: pick ? "G" + pick : null
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
poleCapacityMeta,
|
|
54
|
+
STEEL_POLE_SERIES_KNM,
|
|
55
|
+
TEST_MOMENT_FACTOR,
|
|
56
|
+
poleCapacityCheck
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=chunk-VXVTT6WS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pole-capacity/meta.ts","../src/pole-capacity/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const poleCapacityMeta: CalculatorMeta = {\n name: '支柱容量选型校核',\n nameEn: 'Mast Capacity Selection Check',\n summary: '容量比较法:悬挂水平力与支柱风载合成工作弯矩,对照 GB/T 25020.1 钢支柱检验弯矩系列选型。',\n formula: [\n '直线之字力 F_z = 4(T_j+T_c)·a/l;曲线力 F_q = (T_j+T_c)·l/R',\n '工作弯矩 M = F_h·h_e + P·b·h²/2 + F_wl·h_e',\n '承载力检验弯矩 = 1.5 × 标称容量(25020.1 表 A.2 表值规律)',\n ],\n references: [\n '钢柱直接依据:GB/T 25020.1-2025 第 5.1.1 条 + 附录 A 检验弯矩系列',\n '同口径混凝土柱条款:TB/T 2286-2020 第 5.9.2 条(荷载矢量组合不大于检验弯矩)',\n '分项系数极限状态法(GB/T 32578-2016 6.3.3 表 15)为设计正式口径,不可混用',\n ],\n scope: ['张力:5~45 kN', '跨距:30~90 m', '风压:100~1500 Pa', '支柱高:5~20 m'],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/pole-capacity/',\n};\n","export { poleCapacityMeta } from './meta';\n\n/** GB/T 25020.1-2025 格构式钢支柱标称容量系列(表 A.2),kN·m */\nexport const STEEL_POLE_SERIES_KNM = [150, 200, 250, 300, 350, 400, 450, 500, 550, 600, 650, 750, 900, 1050, 1200, 1500] as const;\n\n/** 承载力检验弯矩 = 1.5 × 标称容量(25020.1 表 A.2 表值规律) */\nexport const TEST_MOMENT_FACTOR = 1.5;\n\n/** 支柱容量校核输入。单位:kN、m、mm、Pa。 */\nexport interface PoleCapacityInput {\n /** 区段类型 */\n readonly section: 'line' | 'curve';\n /** 接触线张力 T_j,kN */\n readonly contactWireTensionKN: number;\n /** 承力索张力 T_c,kN */\n readonly messengerTensionKN: number;\n /** 拉出值 a,mm */\n readonly staggerMM: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 曲线半径 R,m(曲线区段) */\n readonly curveRadiusM?: number;\n /** 水平力合力作用高度 h_e,m */\n readonly resultantHeightM: number;\n /** 设计最大风压 P,Pa */\n readonly windPressurePa: number;\n /** 支柱迎风宽度 b,m */\n readonly poleWidthM: number;\n /** 支柱高度 h,m */\n readonly poleHeightM: number;\n /** 线索风载 F_wl,N */\n readonly wireWindLoadN?: number;\n}\n\nexport interface PoleCapacityResult {\n /** 悬挂水平力 F_h,N */\n readonly horizontalForceN: number;\n /** 工作弯矩 M,kN·m */\n readonly workMomentKNM: number;\n /** 折合标称容量(÷1.5),kN·m */\n readonly nominalNeedKNM: number;\n /** 选型结果 */\n readonly selection: string | null;\n}\n\n/** 支柱容量选型(容量比较法,TB/T 2286 5.9.2 检验弯矩口径;钢柱 25020.1 5.1.1+附录A) */\nexport function poleCapacityCheck(input: PoleCapacityInput): PoleCapacityResult {\n const { section, contactWireTensionKN, messengerTensionKN, staggerMM, spanM, resultantHeightM, windPressurePa, poleWidthM, poleHeightM, wireWindLoadN } = input;\n if (!(contactWireTensionKN >= 0) || !(messengerTensionKN >= 0)) throw new RangeError('张力不能为负');\n const T = contactWireTensionKN + messengerTensionKN;\n const a = staggerMM / 1e3;\n const Fz = (4 * T * a) / spanM; // kN\n let Fh: number;\n if (section === 'curve') {\n if (!(input.curveRadiusM && input.curveRadiusM > 0)) throw new RangeError('曲线半径必须为正');\n const Fq = (T * spanM) / input.curveRadiusM;\n Fh = Math.abs(Fq - Fz);\n } else {\n Fh = Fz;\n }\n const M1 = Fh * resultantHeightM; // 悬挂水平力矩 kN·m\n const M2 = (windPressurePa * poleWidthM * Math.pow(poleHeightM, 2) / 2) / 1e3; // 支柱风载矩\n const M3 = ((wireWindLoadN ?? 0) * resultantHeightM) / 1e3;\n const M = M1 + M2 + M3;\n const nomNeed = M / TEST_MOMENT_FACTOR;\n const pick = STEEL_POLE_SERIES_KNM.find((n) => n >= nomNeed) ?? null;\n return {\n horizontalForceN: Fh * 1e3,\n workMomentKNM: M,\n nominalNeedKNM: nomNeed,\n selection: pick ? 'G' + pick : null,\n };\n}\n"],"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,6BAAc,6BAAc,iCAAkB,gCAAY;AAAA,EAClE,YAAY;AAAA,EACZ,QAAQ;AACV;;;AChBO,IAAM,wBAAwB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI;AAGhH,IAAM,qBAAqB;AAwC3B,SAAS,kBAAkB,OAA8C;AAC9E,QAAM,EAAE,SAAS,sBAAsB,oBAAoB,WAAW,OAAO,kBAAkB,gBAAgB,YAAY,aAAa,cAAc,IAAI;AAC1J,MAAI,EAAE,wBAAwB,MAAM,EAAE,sBAAsB,GAAI,OAAM,IAAI,WAAW,sCAAQ;AAC7F,QAAM,IAAI,uBAAuB;AACjC,QAAM,IAAI,YAAY;AACtB,QAAM,KAAM,IAAI,IAAI,IAAK;AACzB,MAAI;AACJ,MAAI,YAAY,SAAS;AACvB,QAAI,EAAE,MAAM,gBAAgB,MAAM,eAAe,GAAI,OAAM,IAAI,WAAW,kDAAU;AACpF,UAAM,KAAM,IAAI,QAAS,MAAM;AAC/B,SAAK,KAAK,IAAI,KAAK,EAAE;AAAA,EACvB,OAAO;AACL,SAAK;AAAA,EACP;AACA,QAAM,KAAK,KAAK;AAChB,QAAM,KAAM,iBAAiB,aAAa,KAAK,IAAI,aAAa,CAAC,IAAI,IAAK;AAC1E,QAAM,MAAO,iBAAiB,KAAK,mBAAoB;AACvD,QAAM,IAAI,KAAK,KAAK;AACpB,QAAM,UAAU,IAAI;AACpB,QAAM,OAAO,sBAAsB,KAAK,CAAC,MAAM,KAAK,OAAO,KAAK;AAChE,SAAO;AAAA,IACL,kBAAkB,KAAK;AAAA,IACvB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW,OAAO,MAAM,OAAO;AAAA,EACjC;AACF;","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// 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 - (_nullishCoalesce(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
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
exports.cantileverMeta = cantileverMeta; exports.ASSEMBLY_TOLERANCE_MM = ASSEMBLY_TOLERANCE_MM; exports.cantileverCut = cantileverCut;
|
|
42
|
+
//# sourceMappingURL=chunk-WGTOBRYV.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-WGTOBRYV.cjs","../src/cantilever/meta.ts","../src/cantilever/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,eAAA,EAAiC;AAAA,EAC5C,IAAA,EAAM,gFAAA;AAAA,EACN,MAAA,EAAQ,uCAAA;AAAA,EACR,OAAA,EAAS,0LAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,uEAAA;AAAA,IACA,mEAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,8GAAA;AAAA,IACA,wGAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,mCAAA,EAAiB,yCAAA,EAAkB,uCAAc,CAAA;AAAA,EACzD,UAAA,EAAY,sNAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADAA;AACA;AEjBO,IAAM,sBAAA,EAAwB,CAAA;AA0B9B,SAAS,aAAA,CAAc,KAAA,EAA0C;AACtE,EAAA,MAAM,EAAE,eAAA,EAAiB,qBAAA,EAAuB,aAAA,EAAe,WAAW,EAAA,EAAI,KAAA;AAC9E,EAAA,GAAA,CAAI,CAAA,CAAE,gBAAA,EAAkB,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,gEAAA,EAAgB,gBAAA,EAAkB,IAAI,CAAA;AACvF,EAAA,GAAA,CAAI,CAAA,CAAE,sBAAA,EAAwB,CAAA,CAAA,EAAI,MAAM,IAAI,UAAA,CAAW,sEAAA,EAAiB,sBAAA,EAAwB,IAAI,CAAA;AACpG,EAAA,MAAM,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,gBAAA,EAAkB,sBAAA,EAAwB,qBAAqB,CAAA;AAC/G,EAAA,MAAM,WAAA,EAAa,YAAA,EAAA,kBAAe,aAAA,UAAiB,GAAA,CAAA;AACnD,EAAA,IAAI,cAAA,EAA+B,IAAA;AACnC,EAAA,GAAA,CAAI,WAAA,IAAe,KAAA,CAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,WAAA,EAAa,eAAA,EAAiB,MAAM,IAAI,UAAA,CAAW,6FAAuB,CAAA;AAC9E,IAAA,cAAA,EAAiB,WAAA,EAAa,gBAAA,EAAmB,WAAA;AAAA,EACnD;AACA,EAAA,OAAO,EAAE,WAAA,EAAa,UAAA,EAAY,aAAA,EAAe,WAAA,EAAa,sBAAsB,CAAA;AACtF;AFNA;AACA;AACE;AACA;AACA;AACF,sIAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-WGTOBRYV.cjs","sourcesContent":[null,"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"]}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// 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
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
exports.crossSpanMeta = crossSpanMeta; exports.crossSpanAnalyze = crossSpanAnalyze;
|
|
163
|
+
//# sourceMappingURL=chunk-X25CXRVE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-X25CXRVE.cjs","../src/cross-span/meta.ts","../src/cross-span/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,cAAA,EAAgC;AAAA,EAC3C,IAAA,EAAM,4CAAA;AAAA,EACN,MAAA,EAAQ,kCAAA;AAAA,EACR,OAAA,EACE,4UAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,sIAAA;AAAA,IACA,iQAAA;AAAA,IACA,+MAAA;AAAA,IACA,qHAAA;AAAA,IACA,0EAAA;AAAA,IACA,8HAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,kKAAA;AAAA,IACA,uGAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kCAAA;AAAA,IACA,yCAAA;AAAA,IACA,+BAAA;AAAA,IACA,4CAAA;AAAA,IACA,wEAAA;AAAA,IACA,uCAAA;AAAA,IACA,mFAAA;AAAA,IACA,2HAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADDA;AACA;AE+BO,SAAS,gBAAA,CAAiB,KAAA,EAA4C;AAC3E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,QAAA,EAAU,CAAA;AAAA,IACV,UAAA,EAAY,CAAA;AAAA,IACZ,iBAAA,EAAmB,EAAA;AAAA,IACnB,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,sBAAA,EAAwB,EAAA;AAAA,IACxB,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,EAAA;AAAA,IACnB,sBAAA,EAAwB;AAAA,EAC1B,EAAA,EAAI,KAAA;AAEJ,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,SAAS,EAAA,GAAK,CAAA,CAAE,UAAA,GAAa,CAAA,CAAA,EAAI;AACrD,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,wFAAA,EAAqB,SAAS,CAAA,CAAA;AACrD,EAAA;AACc,EAAA;AAC8B,IAAA;AAC5C,EAAA;AACc,EAAA;AAC4B,IAAA;AAC1C,EAAA;AACyB,EAAA;AACF,IAAA;AACvB,EAAA;AACiB,EAAA;AAC8B,IAAA;AAC/C,EAAA;AACe,EAAA;AAC6B,IAAA;AAC5C,EAAA;AACgB,EAAA;AACkC,IAAA;AAClD,EAAA;AACc,EAAA;AAC8B,IAAA;AAC5C,EAAA;AACgB,EAAA;AACiC,IAAA;AACjD,EAAA;AACe,EAAA;AACiC,IAAA;AAChD,EAAA;AAGkB,EAAA;AACA,EAAA;AACN,IAAA;AACkB,MAAA;AAC5B,IAAA;AACF,EAAA;AAEoC,EAAA;AAEX,EAAA;AACW,EAAA;AACZ,IAAA;AACxB,EAAA;AAEyC,EAAA;AACE,EAAA;AACZ,IAAA;AACmB,IAAA;AACjD,EAAA;AAGgC,EAAA;AACO,EAAA;AAClB,IAAA;AACI,IAAA;AACkB,IAAA;AACE,MAAA;AAC5C,IAAA;AACe,IAAA;AACyB,IAAA;AAC1C,EAAA;AAGkB,EAAA;AACE,EAAA;AACsB,EAAA;AACZ,IAAA;AAC9B,EAAA;AACuC,EAAA;AAEH,EAAA;AACI,EAAA;AACQ,EAAA;AAClB,IAAA;AAC9B,EAAA;AACqB,EAAA;AAC+B,EAAA;AAEnC,EAAA;AAC4B,EAAA;AACA,EAAA;AAGjC,EAAA;AACwB,EAAA;AACjB,IAAA;AACA,IAAA;AACuB,IAAA;AACJ,MAAA;AACpC,IAAA;AACyB,IAAA;AAC3B,EAAA;AACqB,EAAA;AACe,EAAA;AACjB,IAAA;AACA,IAAA;AACuB,IAAA;AACJ,MAAA;AACpC,IAAA;AACY,IAAA;AACU,MAAA;AACtB,IAAA;AACF,EAAA;AACmC,EAAA;AAEjB,EAAA;AACoB,EAAA;AAEoB,EAAA;AAEnD,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AF9C8H;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-X25CXRVE.cjs","sourcesContent":[null,"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"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkLBGUOTCJcjs = require('../chunk-LBGUOTCJ.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
exports.CREEPAGE_FLOOR_GENERAL = _chunkLBGUOTCJcjs.CREEPAGE_FLOOR_GENERAL; exports.CREEPAGE_FLOOR_VCUT = _chunkLBGUOTCJcjs.CREEPAGE_FLOOR_VCUT; exports.USCD_BANDS = _chunkLBGUOTCJcjs.USCD_BANDS; exports.creepageCheck = _chunkLBGUOTCJcjs.creepageCheck; exports.creepageMeta = _chunkLBGUOTCJcjs.creepageMeta;
|
|
15
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/creepage/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,kTAAC","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/creepage/index.cjs"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { C as CalculatorMeta } from '../types-C2OanO8N.cjs';
|
|
2
|
+
|
|
3
|
+
declare const creepageMeta: CalculatorMeta;
|
|
4
|
+
|
|
5
|
+
/** 接触网绝缘爬电距离底线(TB 10009-2016 第 5.3.2 条第 1 款),mm */
|
|
6
|
+
declare const CREEPAGE_FLOOR_GENERAL = 1400;
|
|
7
|
+
/** V 形天窗区段上、下行正线间分段绝缘子串底线,mm */
|
|
8
|
+
declare const CREEPAGE_FLOOR_VCUT = 1600;
|
|
9
|
+
/** GB/T 32586 统一爬电比距三档(第 4.4 条,按系统最高持续电压折算) */
|
|
10
|
+
declare const USCD_BANDS: readonly [{
|
|
11
|
+
readonly label: "正常";
|
|
12
|
+
readonly min: 24;
|
|
13
|
+
readonly max: 33;
|
|
14
|
+
}, {
|
|
15
|
+
readonly label: "非正常";
|
|
16
|
+
readonly min: 36;
|
|
17
|
+
readonly max: 40;
|
|
18
|
+
}, {
|
|
19
|
+
readonly label: "苛刻";
|
|
20
|
+
readonly min: 48;
|
|
21
|
+
readonly max: number;
|
|
22
|
+
}];
|
|
23
|
+
/** 爬电距离校核 */
|
|
24
|
+
declare function creepageCheck(input: {
|
|
25
|
+
/** 绝缘子实际爬电距离,mm */
|
|
26
|
+
readonly creepageMM: number;
|
|
27
|
+
/** 使用场景:'general' 一般 | 'vcut' V 形天窗分段串 */
|
|
28
|
+
readonly scenario?: 'general' | 'vcut';
|
|
29
|
+
/** 系统最高电压,kV(GB/T 32586 折算用,默认 29) */
|
|
30
|
+
readonly maxVoltageKV?: number;
|
|
31
|
+
}): {
|
|
32
|
+
floorMM: number;
|
|
33
|
+
passes: boolean;
|
|
34
|
+
uscdBands: {
|
|
35
|
+
label: string;
|
|
36
|
+
mm: number;
|
|
37
|
+
}[];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { CREEPAGE_FLOOR_GENERAL, CREEPAGE_FLOOR_VCUT, USCD_BANDS, creepageCheck, creepageMeta };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { C as CalculatorMeta } from '../types-C2OanO8N.js';
|
|
2
|
+
|
|
3
|
+
declare const creepageMeta: CalculatorMeta;
|
|
4
|
+
|
|
5
|
+
/** 接触网绝缘爬电距离底线(TB 10009-2016 第 5.3.2 条第 1 款),mm */
|
|
6
|
+
declare const CREEPAGE_FLOOR_GENERAL = 1400;
|
|
7
|
+
/** V 形天窗区段上、下行正线间分段绝缘子串底线,mm */
|
|
8
|
+
declare const CREEPAGE_FLOOR_VCUT = 1600;
|
|
9
|
+
/** GB/T 32586 统一爬电比距三档(第 4.4 条,按系统最高持续电压折算) */
|
|
10
|
+
declare const USCD_BANDS: readonly [{
|
|
11
|
+
readonly label: "正常";
|
|
12
|
+
readonly min: 24;
|
|
13
|
+
readonly max: 33;
|
|
14
|
+
}, {
|
|
15
|
+
readonly label: "非正常";
|
|
16
|
+
readonly min: 36;
|
|
17
|
+
readonly max: 40;
|
|
18
|
+
}, {
|
|
19
|
+
readonly label: "苛刻";
|
|
20
|
+
readonly min: 48;
|
|
21
|
+
readonly max: number;
|
|
22
|
+
}];
|
|
23
|
+
/** 爬电距离校核 */
|
|
24
|
+
declare function creepageCheck(input: {
|
|
25
|
+
/** 绝缘子实际爬电距离,mm */
|
|
26
|
+
readonly creepageMM: number;
|
|
27
|
+
/** 使用场景:'general' 一般 | 'vcut' V 形天窗分段串 */
|
|
28
|
+
readonly scenario?: 'general' | 'vcut';
|
|
29
|
+
/** 系统最高电压,kV(GB/T 32586 折算用,默认 29) */
|
|
30
|
+
readonly maxVoltageKV?: number;
|
|
31
|
+
}): {
|
|
32
|
+
floorMM: number;
|
|
33
|
+
passes: boolean;
|
|
34
|
+
uscdBands: {
|
|
35
|
+
label: string;
|
|
36
|
+
mm: number;
|
|
37
|
+
}[];
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { CREEPAGE_FLOOR_GENERAL, CREEPAGE_FLOOR_VCUT, USCD_BANDS, creepageCheck, creepageMeta };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CREEPAGE_FLOOR_GENERAL,
|
|
3
|
+
CREEPAGE_FLOOR_VCUT,
|
|
4
|
+
USCD_BANDS,
|
|
5
|
+
creepageCheck,
|
|
6
|
+
creepageMeta
|
|
7
|
+
} from "../chunk-CLVLOLUJ.js";
|
|
8
|
+
export {
|
|
9
|
+
CREEPAGE_FLOOR_GENERAL,
|
|
10
|
+
CREEPAGE_FLOOR_VCUT,
|
|
11
|
+
USCD_BANDS,
|
|
12
|
+
creepageCheck,
|
|
13
|
+
creepageMeta
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|