@faicad/fai-cq-warehouse 0.13.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.
- package/dist/bearing.d.ts +81 -0
- package/dist/bearing.d.ts.map +1 -0
- package/dist/bearing.js +462 -0
- package/dist/bearing.js.map +1 -0
- package/dist/chain.d.ts +96 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +322 -0
- package/dist/chain.js.map +1 -0
- package/dist/contract.d.ts +9 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +10 -0
- package/dist/contract.js.map +1 -0
- package/dist/data/brad_tee_nut_parameters.json +29 -0
- package/dist/data/button_head_parameters.json +82 -0
- package/dist/data/button_head_with_collar_parameters.json +98 -0
- package/dist/data/chamfered_washer_parameters.json +262 -0
- package/dist/data/cheese_head_parameters.json +182 -0
- package/dist/data/cheese_head_washer_parameters.json +112 -0
- package/dist/data/clearance_hole_sizes.json +427 -0
- package/dist/data/countersunk_head_parameters.json +1752 -0
- package/dist/data/domed_cap_nut_parameters.json +62 -0
- package/dist/data/drill_sizes.json +320 -0
- package/dist/data/heatset_nut_parameters.json +354 -0
- package/dist/data/hex_head_parameters.json +408 -0
- package/dist/data/hex_head_with_flange_parameters.json +114 -0
- package/dist/data/hex_nut_parameters.json +250 -0
- package/dist/data/hex_nut_with_flange_parameters.json +92 -0
- package/dist/data/imperial_set_screw_parameters.json +150 -0
- package/dist/data/iso10664def.json +82 -0
- package/dist/data/metric_set_screw_parameters.json +50 -0
- package/dist/data/nominal_screw_lengths.json +106 -0
- package/dist/data/pan_head_parameters.json +322 -0
- package/dist/data/pan_head_with_collar_parameters.json +56 -0
- package/dist/data/plain_washer_parameters.json +464 -0
- package/dist/data/raised_cheese_head_parameters.json +82 -0
- package/dist/data/raised_countersunk_oval_head_parameters.json +314 -0
- package/dist/data/setscrew_parameters.json +110 -0
- package/dist/data/single_row_angular_contact_ball_bearing_parameters.json +209 -0
- package/dist/data/single_row_capped_deep_groove_ball_bearing_parameters.json +527 -0
- package/dist/data/single_row_cylindrical_roller_bearing_parameters.json +227 -0
- package/dist/data/single_row_deep_groove_ball_bearing_parameters.json +653 -0
- package/dist/data/single_row_tapered_roller_bearing_parameters.json +756 -0
- package/dist/data/socket_head_cap_parameters.json +856 -0
- package/dist/data/square_nut_parameters.json +26 -0
- package/dist/data/tap_hole_sizes.json +398 -0
- package/dist/data/tapered-fillet-drop.json +109 -0
- package/dist/data/unchamfered_hex_nut_parameters.json +42 -0
- package/dist/holes.d.ts +186 -0
- package/dist/holes.d.ts.map +1 -0
- package/dist/holes.js +197 -0
- package/dist/holes.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +117 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +25 -0
- package/dist/kernel.js.map +1 -0
- package/dist/measure.d.ts +52 -0
- package/dist/measure.d.ts.map +1 -0
- package/dist/measure.js +158 -0
- package/dist/measure.js.map +1 -0
- package/dist/nut.d.ts +315 -0
- package/dist/nut.d.ts.map +1 -0
- package/dist/nut.js +700 -0
- package/dist/nut.js.map +1 -0
- package/dist/params.d.ts +178 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +330 -0
- package/dist/params.js.map +1 -0
- package/dist/primitives.d.ts +440 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +597 -0
- package/dist/primitives.js.map +1 -0
- package/dist/recess.d.ts +129 -0
- package/dist/recess.d.ts.map +1 -0
- package/dist/recess.js +323 -0
- package/dist/recess.js.map +1 -0
- package/dist/screw.d.ts +101 -0
- package/dist/screw.d.ts.map +1 -0
- package/dist/screw.js +945 -0
- package/dist/screw.js.map +1 -0
- package/dist/sprocket.d.ts +135 -0
- package/dist/sprocket.d.ts.map +1 -0
- package/dist/sprocket.js +261 -0
- package/dist/sprocket.js.map +1 -0
- package/dist/test-setup.d.ts +11 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +30 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/thread.d.ts +189 -0
- package/dist/thread.d.ts.map +1 -0
- package/dist/thread.js +501 -0
- package/dist/thread.js.map +1 -0
- package/dist/washer.d.ts +126 -0
- package/dist/washer.d.ts.map +1 -0
- package/dist/washer.js +204 -0
- package/dist/washer.js.map +1 -0
- package/package.json +55 -0
package/dist/chain.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chain — P1-a 链条(`chain.py` 的函数式移植)
|
|
3
|
+
*
|
|
4
|
+
* 上游 `Chain` 类:给定若干链轮(齿数/位置/正 wrap 方向),计算链条路径
|
|
5
|
+
* (入/出角 → 段长 → 滚子位置),产出滚子链逐节装配体(`{name, solid}[]`,
|
|
6
|
+
* 对齐 `*ExportParts` 形态,逐件进 STEP 产品名)。
|
|
7
|
+
*
|
|
8
|
+
* 语义对齐 chain.py:
|
|
9
|
+
* - `pitchRadii` = `Sprocket.sprocket_pitch_radius`(复用 sprocket.ts);
|
|
10
|
+
* - 入/出角:`_calc_entry_exit_angles`(atan2 + asin 四分支);
|
|
11
|
+
* - 段长:`_calc_segment_lengths`(弦长 + 弧长交错,`_interleave_lists`/`_gen_mix_sum_list`);
|
|
12
|
+
* - 滚子定位:`_calc_roller_locations`(弧段绕轮心、线段线性插值);
|
|
13
|
+
* - 链节:`make_link`(inner=滚子对,outer=销轴对,dog-bone 链板);
|
|
14
|
+
* - `spktInitialRotation` = 首滚子角 + 180/齿数(齿间夹滚子)。
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ 局限:上游 `Chain` 支持 3+ 链轮与斜面(`chain_plane`);本移植先覆盖
|
|
17
|
+
* 测试锚定的 **2 链轮共面**形态(`sprocket_and_chain_tests.py:184` 两例),
|
|
18
|
+
* `spkt_normal` 仅支持 (0,0,1)。多链轮/斜面为后续增量。
|
|
19
|
+
*/
|
|
20
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
21
|
+
/** 2D 向量(chain_plane 局部坐标)。 */
|
|
22
|
+
interface V2 {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
}
|
|
26
|
+
/** Chain 构造参数(逐字沿用 Python `Chain.__init__`,mm)。 */
|
|
27
|
+
export interface ChainParams {
|
|
28
|
+
/** 各链轮齿数(≥2 个)。 */
|
|
29
|
+
spkt_teeth: number[];
|
|
30
|
+
/** 各链轮中心(2D,chain 平面内,mm)。 */
|
|
31
|
+
spkt_locations: [number, number][];
|
|
32
|
+
/** 各链轮是否正方向缠绕(链条从上方看逆时针包住该轮)。 */
|
|
33
|
+
positive_chain_wrap: boolean[];
|
|
34
|
+
/** 链节距(mm),默认 12.7 = 1/2"(ANSI 40)。 */
|
|
35
|
+
chain_pitch?: number;
|
|
36
|
+
/** 滚子直径(mm),默认 7.9375 = 5/16"。 */
|
|
37
|
+
roller_diameter?: number;
|
|
38
|
+
/** 滚子长度(mm),默认 2.38125 = 3/32"。 */
|
|
39
|
+
roller_length?: number;
|
|
40
|
+
/** 链板单厚(mm),默认 1.0。 */
|
|
41
|
+
link_plate_thickness?: number;
|
|
42
|
+
/** 链轮轴法向——仅支持 (0,0,1)。 */
|
|
43
|
+
spkt_normal?: [number, number, number];
|
|
44
|
+
}
|
|
45
|
+
/** 单节链(导出条目:名字进 STEP 产品名)。 */
|
|
46
|
+
export interface ChainPart {
|
|
47
|
+
name: string;
|
|
48
|
+
solid: BrepHandle;
|
|
49
|
+
}
|
|
50
|
+
/** Chain 结果:逐件装配 + 派生量(对应上游各 property)。 */
|
|
51
|
+
export interface ChainResult {
|
|
52
|
+
/** 逐节链零件(link0..linkN-1),多产品 STEP 逐件导出用。 */
|
|
53
|
+
parts: ChainPart[];
|
|
54
|
+
/** 各链轮节圆半径。 */
|
|
55
|
+
pitchRadii: number[];
|
|
56
|
+
/** 链条总长(mm)。 */
|
|
57
|
+
chainLength: number;
|
|
58
|
+
/** 链长折合节数(浮点,上游 `chain_links`)。 */
|
|
59
|
+
chainLinks: number;
|
|
60
|
+
/** 滚子数(上游 `num_rollers`)。 */
|
|
61
|
+
numRollers: number;
|
|
62
|
+
/** 滚子圆心(chain 平面局部坐标)。 */
|
|
63
|
+
rollerLoc: V2[];
|
|
64
|
+
/** 各链轮初始转角(度,对齿让滚子)。 */
|
|
65
|
+
spktInitialRotation: number[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 单节链(chain.py `make_link` 的函数式移植)。
|
|
69
|
+
* @param p - 链节参数:chainPitch 节距、linkPlateThickness 板厚、inner 内/外节、rollerLength 滚子长、rollerDiameter 滚子径。
|
|
70
|
+
* @returns 链节实体,中心在两滚子连线中点、x 轴沿链方向。
|
|
71
|
+
*/
|
|
72
|
+
export declare function makeLink(p: {
|
|
73
|
+
chainPitch: number;
|
|
74
|
+
linkPlateThickness: number;
|
|
75
|
+
inner: boolean;
|
|
76
|
+
rollerLength: number;
|
|
77
|
+
rollerDiameter: number;
|
|
78
|
+
}): BrepHandle;
|
|
79
|
+
/**
|
|
80
|
+
* 构建滚子链(上游 `Chain` 构造函数全流程的函数式形态)。
|
|
81
|
+
*
|
|
82
|
+
* @param p - 链参数(逐字沿用 Python,mm)。
|
|
83
|
+
* @returns 逐件装配与派生量。
|
|
84
|
+
* @throws 参数不合法(齿数/位置/wrap 长度不一致、少于 2 轮、重复位置、斜面)。
|
|
85
|
+
*/
|
|
86
|
+
export declare function buildChain(p: ChainParams): ChainResult;
|
|
87
|
+
/**
|
|
88
|
+
* 供链轮初始转角旋转(`assemble_chain_transmission` 的 B 侧等价)。
|
|
89
|
+
* @param solid - 待旋转的链轮实体。
|
|
90
|
+
* @param rotationDeg - 绕 +Z 旋转角度(度)。
|
|
91
|
+
* @param loc - 链轮平面位置 [x, y]。
|
|
92
|
+
* @returns 旋转并平移后的链轮实体。
|
|
93
|
+
*/
|
|
94
|
+
export declare function placeSprocket(solid: BrepHandle, rotationDeg: number, loc: [number, number]): BrepHandle;
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAA;AAkBzD,+BAA+B;AAC/B,UAAU,EAAE;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE;AAErC,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,8BAA8B;IAC9B,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;IAClC,iCAAiC;IACjC,mBAAmB,EAAE,OAAO,EAAE,CAAA;IAC9B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kCAAkC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mCAAmC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uBAAuB;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC;AAED,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,UAAU,CAAA;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,4CAA4C;IAC5C,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,eAAe;IACf,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,SAAS,EAAE,EAAE,EAAE,CAAA;IACf,wBAAwB;IACxB,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAoID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,KAAK,EAAE,OAAO,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;CACvB,GAAG,UAAU,CAmCb;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAkItD;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CAOvG"}
|
package/dist/chain.js
ADDED
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* chain — P1-a 链条(`chain.py` 的函数式移植)
|
|
3
|
+
*
|
|
4
|
+
* 上游 `Chain` 类:给定若干链轮(齿数/位置/正 wrap 方向),计算链条路径
|
|
5
|
+
* (入/出角 → 段长 → 滚子位置),产出滚子链逐节装配体(`{name, solid}[]`,
|
|
6
|
+
* 对齐 `*ExportParts` 形态,逐件进 STEP 产品名)。
|
|
7
|
+
*
|
|
8
|
+
* 语义对齐 chain.py:
|
|
9
|
+
* - `pitchRadii` = `Sprocket.sprocket_pitch_radius`(复用 sprocket.ts);
|
|
10
|
+
* - 入/出角:`_calc_entry_exit_angles`(atan2 + asin 四分支);
|
|
11
|
+
* - 段长:`_calc_segment_lengths`(弦长 + 弧长交错,`_interleave_lists`/`_gen_mix_sum_list`);
|
|
12
|
+
* - 滚子定位:`_calc_roller_locations`(弧段绕轮心、线段线性插值);
|
|
13
|
+
* - 链节:`make_link`(inner=滚子对,outer=销轴对,dog-bone 链板);
|
|
14
|
+
* - `spktInitialRotation` = 首滚子角 + 180/齿数(齿间夹滚子)。
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ 局限:上游 `Chain` 支持 3+ 链轮与斜面(`chain_plane`);本移植先覆盖
|
|
17
|
+
* 测试锚定的 **2 链轮共面**形态(`sprocket_and_chain_tests.py:184` 两例),
|
|
18
|
+
* `spkt_normal` 仅支持 (0,0,1)。多链轮/斜面为后续增量。
|
|
19
|
+
*/
|
|
20
|
+
import { requireKernel } from './kernel.js';
|
|
21
|
+
import { arcEdge, cylinder, extrudeFace, fuse, planarFace, rotateAbout, translate, wireFromEdges, cylinderBetween, } from './primitives.js';
|
|
22
|
+
import { sprocketPitchRadius } from './sprocket.js';
|
|
23
|
+
const DEG = Math.PI / 180;
|
|
24
|
+
const RAD = 180 / Math.PI;
|
|
25
|
+
// ── 基础 2D 工具 ──────────────────────────────────────────────────────────────
|
|
26
|
+
function sub(a, b) { return { x: a.x - b.x, y: a.y - b.y }; }
|
|
27
|
+
function len(a) { return Math.hypot(a.x, a.y); }
|
|
28
|
+
function rotZ(a, deg) {
|
|
29
|
+
const c = Math.cos(deg * DEG), s = Math.sin(deg * DEG);
|
|
30
|
+
return { x: a.x * c - a.y * s, y: a.x * s + a.y * c };
|
|
31
|
+
}
|
|
32
|
+
/** 上游 `Vector(0, r).rotateZ(a)`:先竖直再转角。 */
|
|
33
|
+
function radial(r, deg) { return rotZ({ x: 0, y: r }, deg); }
|
|
34
|
+
function add(a, b) { return { x: a.x + b.x, y: a.y + b.y }; }
|
|
35
|
+
function scale(a, k) { return { x: a.x * k, y: a.y * k }; }
|
|
36
|
+
/** 上游 `_interleave_lists`:a 占偶数位、b 占奇数位。 */
|
|
37
|
+
function interleave(a, b) {
|
|
38
|
+
if (a.length !== b.length)
|
|
39
|
+
throw new Error('interleave requires two equal lists');
|
|
40
|
+
const out = [];
|
|
41
|
+
for (let i = 0; i < a.length; i++) {
|
|
42
|
+
out.push(a[i], b[i]);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/** 上游 `_gen_mix_sum_list`:交错前缀和。 */
|
|
47
|
+
function mixSumList(a, b) {
|
|
48
|
+
if (a.length !== b.length)
|
|
49
|
+
throw new Error('mixSumList requires two equal lists');
|
|
50
|
+
const out = [a[0], a[0] + b[0]];
|
|
51
|
+
for (let i = 1; i < a.length; i++) {
|
|
52
|
+
out.push(out[out.length - 1] + a[i]);
|
|
53
|
+
out.push(out[out.length - 1] + b[i]);
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
/** 上游 `_find_segment`:第一个大于 lenValue 的前缀和下标。 */
|
|
58
|
+
function findSegment(v, sums) {
|
|
59
|
+
for (let i = 0; i < sums.length; i++) {
|
|
60
|
+
if (v < sums[i])
|
|
61
|
+
return i;
|
|
62
|
+
}
|
|
63
|
+
return NaN;
|
|
64
|
+
}
|
|
65
|
+
// ── 链节几何(chain.py `make_link`)──────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* dog-bone 链板 plan wire(chain.py:637-652 的等价轮廓)。
|
|
68
|
+
*
|
|
69
|
+
* 上游逐字:hLine(pitch/2+plateR) → threePointArc((pitch/2, plateR), tangent)
|
|
70
|
+
* → radiusArc((0, neck), neck_r) → mirrorX() → mirrorY()。
|
|
71
|
+
* B 侧以**密集采样折线**重建同一条闭曲线(每弧 24 段,远细于几何容差):
|
|
72
|
+
* 大端圆弧圆心 (pitch/2, 0)、半径 plateR;颈部圆弧半径 neckR、过切点与 (0, neck)。
|
|
73
|
+
*/
|
|
74
|
+
function linkPlateWire(chainPitch) {
|
|
75
|
+
const plateScale = chainPitch / (0.5 * 25.4);
|
|
76
|
+
const neck = (plateScale * 4.5) / 2;
|
|
77
|
+
const plateR = (plateScale * 8.5) / 2;
|
|
78
|
+
const neckR = (Math.pow(chainPitch / 2, 2) + Math.pow(neck, 2) - Math.pow(plateR, 2)) /
|
|
79
|
+
(2 * plateR - 2 * neck);
|
|
80
|
+
const plateCenX = chainPitch / 2;
|
|
81
|
+
const neckIntersectionA = Math.atan2(neck + neckR, chainPitch / 2) * RAD;
|
|
82
|
+
// 上游:Vector(plate_r,0).rotateZ(180-a) + (pitch/2, 0) —— 与大端圆的切点
|
|
83
|
+
const t = rotZ({ x: plateR, y: 0 }, 180 - neckIntersectionA);
|
|
84
|
+
const tangent = { x: t.x + plateCenX, y: t.y };
|
|
85
|
+
const endPt = { x: 0, y: neck };
|
|
86
|
+
// 颈部圆弧圆心:距切点与 (0, neck) 均 neckR,取 y 较小解(弦下方,劣弧朝上)
|
|
87
|
+
const dx = endPt.x - tangent.x, dy = endPt.y - tangent.y;
|
|
88
|
+
const d = Math.hypot(dx, dy);
|
|
89
|
+
if (d > 2 * Math.abs(neckR))
|
|
90
|
+
throw new Error('chain link: neck arc impossible');
|
|
91
|
+
const midX = (tangent.x + endPt.x) / 2, midY = (tangent.y + endPt.y) / 2;
|
|
92
|
+
const h = Math.sqrt(Math.max(neckR * neckR - (d / 2) * (d / 2), 0));
|
|
93
|
+
const ux = -dy / d, uy = dx / d;
|
|
94
|
+
const c1 = { x: midX + ux * h, y: midY + uy * h };
|
|
95
|
+
const c2 = { x: midX - ux * h, y: midY - uy * h };
|
|
96
|
+
// 上游 radiusArc((0, neck), -neck_r):负半径 = 凹弧(dog-bone 收腰),圆心在
|
|
97
|
+
// 弦**上方**(y 较大解)——选凸弧会每块板多出 ~6.94 mm²(A/B 体积比对实测)。
|
|
98
|
+
const cen = c1.y > c2.y ? c1 : c2;
|
|
99
|
+
// 精确圆弧轮廓(与上游 threePointArc/radiusArc 逐字对应,8 条三点弧)。
|
|
100
|
+
// 四个圆心:大端右 C_R=(plateCenX,0) / 大端左 C_L=镜像;颈部右上 cen / 左 cenL=镜像。
|
|
101
|
+
// ⚠️ 每条弧的中点必须用**该弧自己的圆心**算(镜像弧用镜像圆心)。
|
|
102
|
+
const z0 = 0;
|
|
103
|
+
const p3 = (v) => ({ x: v.x, y: v.y, z: z0 });
|
|
104
|
+
const CR = { x: plateCenX, y: 0 };
|
|
105
|
+
const CL = { x: -plateCenX, y: 0 };
|
|
106
|
+
const cenL = { x: -cen.x, y: cen.y };
|
|
107
|
+
/** 圆上 a→b 弧的中点(角度走劣向,da 规范到 (−π,π])。 */
|
|
108
|
+
const arcMid = (center, r, a, b) => {
|
|
109
|
+
const aa = Math.atan2(a.y - center.y, a.x - center.x);
|
|
110
|
+
let da = Math.atan2(b.y - center.y, b.x - center.x) - aa;
|
|
111
|
+
while (da > Math.PI)
|
|
112
|
+
da -= 2 * Math.PI;
|
|
113
|
+
while (da < -Math.PI)
|
|
114
|
+
da += 2 * Math.PI;
|
|
115
|
+
const am = aa + da / 2;
|
|
116
|
+
return { x: center.x + r * Math.cos(am), y: center.y + r * Math.sin(am) };
|
|
117
|
+
};
|
|
118
|
+
const S = { x: plateCenX + plateR, y: 0 };
|
|
119
|
+
const SL = { x: -S.x, y: S.y };
|
|
120
|
+
const N = endPt;
|
|
121
|
+
const Tl = { x: -tangent.x, y: tangent.y };
|
|
122
|
+
const nR = Math.abs(neckR);
|
|
123
|
+
const edges = [
|
|
124
|
+
// 右上:大端弧 S→切点(圆心 CR),颈部弧 切点→N(圆心 cen)
|
|
125
|
+
arcEdge(p3(S), p3(arcMid(CR, plateR, S, tangent)), p3(tangent)),
|
|
126
|
+
arcEdge(p3(tangent), p3(arcMid(cen, nR, tangent, N)), p3(N)),
|
|
127
|
+
// 左上:颈部弧 N→Tl(圆心 cenL),大端弧 Tl→SL(圆心 CL)
|
|
128
|
+
arcEdge(p3(N), p3(arcMid(cenL, nR, N, Tl)), p3(Tl)),
|
|
129
|
+
arcEdge(p3(Tl), p3(arcMid(CL, plateR, Tl, SL)), p3(SL)),
|
|
130
|
+
// 左下:大端弧 SL→my(Tl)(圆心 CL),颈部弧 my(Tl)→my(N)(圆心 my(cenL))
|
|
131
|
+
arcEdge(p3(SL), p3(arcMid(CL, plateR, SL, { x: Tl.x, y: -Tl.y })), p3({ x: Tl.x, y: -Tl.y })),
|
|
132
|
+
arcEdge(p3({ x: Tl.x, y: -Tl.y }), p3(arcMid({ x: cenL.x, y: -cenL.y }, nR, { x: Tl.x, y: -Tl.y }, { x: N.x, y: -N.y })), p3({ x: N.x, y: -N.y })),
|
|
133
|
+
// 右下:颈部弧 my(N)→my(切点)(圆心 my(cen)),大端弧 my(切点)→S(圆心 CR)
|
|
134
|
+
arcEdge(p3({ x: N.x, y: -N.y }), p3(arcMid({ x: cen.x, y: -cen.y }, nR, { x: N.x, y: -N.y }, { x: tangent.x, y: -tangent.y })), p3({ x: tangent.x, y: -tangent.y })),
|
|
135
|
+
arcEdge(p3({ x: tangent.x, y: -tangent.y }), p3(arcMid(CR, plateR, { x: tangent.x, y: -tangent.y }, S)), p3(S)),
|
|
136
|
+
];
|
|
137
|
+
const wire = wireFromEdges(edges);
|
|
138
|
+
return { wire, plateR };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 单节链(chain.py `make_link` 的函数式移植)。
|
|
142
|
+
* @param p - 链节参数:chainPitch 节距、linkPlateThickness 板厚、inner 内/外节、rollerLength 滚子长、rollerDiameter 滚子径。
|
|
143
|
+
* @returns 链节实体,中心在两滚子连线中点、x 轴沿链方向。
|
|
144
|
+
*/
|
|
145
|
+
export function makeLink(p) {
|
|
146
|
+
const { chainPitch, linkPlateThickness: t, inner, rollerLength: rl, rollerDiameter: rd } = p;
|
|
147
|
+
const { wire, plateR } = linkPlateWire(chainPitch);
|
|
148
|
+
const face = planarFace(wire);
|
|
149
|
+
// 板轮廓两瓣已在 ±pitch/2(wire 自带);上游再 translate(pitch/2,0,·) 把瓣心
|
|
150
|
+
// 移到 0 与 pitch(滚子/销轴位置)。板体 z ∈ [0, t]。
|
|
151
|
+
const plate = extrudeFace(face, t);
|
|
152
|
+
if (inner) {
|
|
153
|
+
// 上游:两块板 z ∈ [rl/2, rl/2+t] 与 [-rl/2-t, -rl/2](both=True ±t/2 再平移)
|
|
154
|
+
let link = fuse(translate(plate, chainPitch / 2, 0, rl / 2), translate(plate, chainPitch / 2, 0, -rl / 2 - t));
|
|
155
|
+
// 两个滚子:(0,0) 与 (pitch,0),滚子长 rl 居中(z ∈ [-rl/2, rl/2])
|
|
156
|
+
link = fuse(link, cylinderBetween(rd / 2, -rl / 2, rl / 2));
|
|
157
|
+
link = fuse(link, translate(cylinderBetween(rd / 2, -rl / 2, rl / 2), chainPitch, 0, 0));
|
|
158
|
+
void plateR;
|
|
159
|
+
return link;
|
|
160
|
+
}
|
|
161
|
+
// 外节(chain.py:667-691):板 + 顶面两个销轴凸台(r=plateR/4,高 t/3),
|
|
162
|
+
// 整体平移 z=rl/2+t(上游 (rl+3t)/2 − t/2);第二块由第一块绕 x 轴转 180° 得到
|
|
163
|
+
// ((x,y,z)→(x,−y,−z),轮廓双轴对称故 y 翻转不可见)。
|
|
164
|
+
const pinR = plateR / 4;
|
|
165
|
+
let plateWithPins = fuse(plate, translate(cylinder(pinR, t / 3), chainPitch / 2, 0, t));
|
|
166
|
+
plateWithPins = fuse(plateWithPins, translate(cylinder(pinR, t / 3), -chainPitch / 2, 0, t));
|
|
167
|
+
const zShift = rl / 2 + t;
|
|
168
|
+
const plateA = translate(plateWithPins, chainPitch / 2, 0, zShift);
|
|
169
|
+
const plateB = rotateAbout(plateA, { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } }, Math.PI);
|
|
170
|
+
return fuse(plateA, plateB);
|
|
171
|
+
}
|
|
172
|
+
// ── Chain 主流程 ─────────────────────────────────────────────────────────────
|
|
173
|
+
/**
|
|
174
|
+
* 构建滚子链(上游 `Chain` 构造函数全流程的函数式形态)。
|
|
175
|
+
*
|
|
176
|
+
* @param p - 链参数(逐字沿用 Python,mm)。
|
|
177
|
+
* @returns 逐件装配与派生量。
|
|
178
|
+
* @throws 参数不合法(齿数/位置/wrap 长度不一致、少于 2 轮、重复位置、斜面)。
|
|
179
|
+
*/
|
|
180
|
+
export function buildChain(p) {
|
|
181
|
+
const chainPitch = p.chain_pitch ?? 12.7;
|
|
182
|
+
const rollerDiameter = p.roller_diameter ?? 7.9375;
|
|
183
|
+
const rollerLength = p.roller_length ?? 2.38125;
|
|
184
|
+
const plateT = p.link_plate_thickness ?? 1.0;
|
|
185
|
+
const teeth = p.spkt_teeth;
|
|
186
|
+
const locs = p.spkt_locations.map(([x, y]) => ({ x, y }));
|
|
187
|
+
const wrap = p.positive_chain_wrap;
|
|
188
|
+
if (!Array.isArray(teeth) || !teeth.every((t) => Number.isInteger(t) && t > 0)) {
|
|
189
|
+
throw new Error('spkt_teeth must be a list of positive int');
|
|
190
|
+
}
|
|
191
|
+
if (teeth.length !== locs.length || teeth.length !== wrap.length) {
|
|
192
|
+
throw new Error('Length of spkt_teeth, spkt_locations, positive_chain_wrap not equal');
|
|
193
|
+
}
|
|
194
|
+
if (teeth.length < 2)
|
|
195
|
+
throw new Error('Chain requires at least 2 sprockets');
|
|
196
|
+
const seen = new Set(locs.map((l) => `${l.x},${l.y}`));
|
|
197
|
+
if (seen.size !== locs.length)
|
|
198
|
+
throw new Error('Sprocket locations must be unique');
|
|
199
|
+
const normal = p.spkt_normal ?? [0, 0, 1];
|
|
200
|
+
if (normal[0] !== 0 || normal[1] !== 0) {
|
|
201
|
+
throw new Error('chain: only spkt_normal=(0,0,1) is supported (planar chains)');
|
|
202
|
+
}
|
|
203
|
+
const n = teeth.length;
|
|
204
|
+
const pitchRadii = teeth.map((t) => sprocketPitchRadius(t, chainPitch));
|
|
205
|
+
// 入/出角(chain.py `_calc_entry_exit_angles` 四分支逐字)
|
|
206
|
+
const sep = [];
|
|
207
|
+
for (let s = 0; s < n; s++)
|
|
208
|
+
sep.push(len(sub(locs[(s + 1) % n], locs[s])));
|
|
209
|
+
const baseA = locs.map((l, s) => {
|
|
210
|
+
const nxt = locs[(s + 1) % n];
|
|
211
|
+
return 90 + Math.atan2(l.y - nxt.y, l.x - nxt.x) * RAD;
|
|
212
|
+
});
|
|
213
|
+
const exitA = [];
|
|
214
|
+
for (let s = 0; s < n; s++) {
|
|
215
|
+
const s1 = (s + 1) % n;
|
|
216
|
+
const ratio = (pitchRadii[s] - pitchRadii[s1]) / sep[s];
|
|
217
|
+
const ratioSum = (pitchRadii[s] + pitchRadii[s1]) / sep[s];
|
|
218
|
+
if (wrap[s] && wrap[s1]) {
|
|
219
|
+
exitA.push(baseA[s] - 90 + Math.asin(clamp1(ratio)) * RAD);
|
|
220
|
+
}
|
|
221
|
+
else if (wrap[s] && !wrap[s1]) {
|
|
222
|
+
exitA.push(baseA[s] - 90 + Math.asin(clamp1(ratioSum)) * RAD);
|
|
223
|
+
}
|
|
224
|
+
else if (!wrap[s] && wrap[s1]) {
|
|
225
|
+
exitA.push(baseA[s] + 90 - Math.asin(clamp1(ratioSum)) * RAD);
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
exitA.push(baseA[s] + 90 - Math.asin(clamp1(ratio)) * RAD);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// 上游:entry_a[s] = exit_a[s-1](+180 当 wrap 翻转)——取的是**上一轮**的出角
|
|
232
|
+
const entryA = exitA.map((_, s) => {
|
|
233
|
+
const prev = (s - 1 + n) % n;
|
|
234
|
+
return wrap[s] !== wrap[prev] ? exitA[prev] + 180 : exitA[prev];
|
|
235
|
+
});
|
|
236
|
+
// 段长(chain.py `_calc_segment_lengths`)
|
|
237
|
+
const arcA = wrap.map((w, s) => w
|
|
238
|
+
? (exitA[s] - entryA[s] + 360) % 360
|
|
239
|
+
: (entryA[s] - exitA[s] + 360) % 360);
|
|
240
|
+
const lineL = wrap.map((w, s) => {
|
|
241
|
+
const s1 = (s + 1) % n;
|
|
242
|
+
const dR = w === wrap[s1] ? pitchRadii[s] - pitchRadii[s1] : pitchRadii[s] + pitchRadii[s1];
|
|
243
|
+
return Math.sqrt(Math.max(sep[s] ** 2 - dR ** 2, 0));
|
|
244
|
+
});
|
|
245
|
+
const arcL = arcA.map((a, s) => Math.abs((a * 2 * Math.PI * pitchRadii[s]) / 360));
|
|
246
|
+
const segmentLengths = interleave(arcL, lineL);
|
|
247
|
+
const segmentSums = mixSumList(arcL, lineL);
|
|
248
|
+
const chainLength = segmentSums[segmentSums.length - 1];
|
|
249
|
+
const chainLinks = chainLength / chainPitch;
|
|
250
|
+
const numRollers = Math.floor(chainLength / chainPitch);
|
|
251
|
+
// 滚子定位(chain.py `_calc_roller_locations`)
|
|
252
|
+
const entryExitLoc = entryA.map((a, s) => [
|
|
253
|
+
add(locs[s], radial(pitchRadii[s], a)),
|
|
254
|
+
add(locs[s], radial(pitchRadii[s], exitA[s])),
|
|
255
|
+
]);
|
|
256
|
+
const rollerLoc = [];
|
|
257
|
+
const rollerAPerSpkt = [];
|
|
258
|
+
for (let i = 0; i < numRollers; i++) {
|
|
259
|
+
const rollerDistance = (i * chainPitch) % chainLength;
|
|
260
|
+
const seg = findSegment(rollerDistance, segmentSums);
|
|
261
|
+
if (!Number.isInteger(seg))
|
|
262
|
+
throw new Error('chain: roller segment not found');
|
|
263
|
+
const spkt = Math.floor(seg / 2);
|
|
264
|
+
const along = 1 - (segmentSums[seg] - rollerDistance) / segmentLengths[seg];
|
|
265
|
+
if (seg % 2 === 0) {
|
|
266
|
+
const dir = wrap[spkt] ? 1 : -1;
|
|
267
|
+
const a = entryA[spkt] + dir * arcA[spkt] * along;
|
|
268
|
+
rollerLoc.push(add(locs[spkt], radial(pitchRadii[spkt], a)));
|
|
269
|
+
rollerAPerSpkt.push([spkt, a]);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
const from = entryExitLoc[spkt][1];
|
|
273
|
+
const to = entryExitLoc[(spkt + 1) % n][0];
|
|
274
|
+
rollerLoc.push(add(from, scale(sub(to, from), along)));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// 各轮首个滚子角 → 链轮初始转角(齿间夹滚子)
|
|
278
|
+
const spktInitialRotation = teeth.map((t, s) => {
|
|
279
|
+
const idx = rollerAPerSpkt.findIndex(([sp]) => sp === s);
|
|
280
|
+
if (idx < 0)
|
|
281
|
+
throw new Error(`chain: no roller contacts sprocket ${s}`);
|
|
282
|
+
return rollerAPerSpkt[idx][1] + 180 / t;
|
|
283
|
+
});
|
|
284
|
+
// 逐节装配(chain.py `_assemble_chain`)
|
|
285
|
+
const parts = [];
|
|
286
|
+
const cacheInner = makeLink({ chainPitch, linkPlateThickness: plateT, inner: true, rollerLength, rollerDiameter });
|
|
287
|
+
const cacheOuter = makeLink({ chainPitch, linkPlateThickness: plateT, inner: false, rollerLength, rollerDiameter });
|
|
288
|
+
for (let i = 0; i < numRollers; i++) {
|
|
289
|
+
const cur = rollerLoc[i];
|
|
290
|
+
const nxt = rollerLoc[(i + 1) % numRollers];
|
|
291
|
+
const rotDeg = Math.atan2(nxt.y - cur.y, nxt.x - cur.x) * RAD;
|
|
292
|
+
const base = i % 2 === 0 ? cacheInner : cacheOuter;
|
|
293
|
+
const k = requireKernel();
|
|
294
|
+
const rotated = rotateAbout(base, { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } }, rotDeg * DEG);
|
|
295
|
+
const placed = k.translate(rotated, cur.x, cur.y, 0);
|
|
296
|
+
parts.push({ name: `link${i}`, solid: placed });
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
parts,
|
|
300
|
+
pitchRadii,
|
|
301
|
+
chainLength,
|
|
302
|
+
chainLinks,
|
|
303
|
+
numRollers,
|
|
304
|
+
rollerLoc,
|
|
305
|
+
spktInitialRotation,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
function clamp1(v) {
|
|
309
|
+
return Math.min(1, Math.max(-1, v));
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* 供链轮初始转角旋转(`assemble_chain_transmission` 的 B 侧等价)。
|
|
313
|
+
* @param solid - 待旋转的链轮实体。
|
|
314
|
+
* @param rotationDeg - 绕 +Z 旋转角度(度)。
|
|
315
|
+
* @param loc - 链轮平面位置 [x, y]。
|
|
316
|
+
* @returns 旋转并平移后的链轮实体。
|
|
317
|
+
*/
|
|
318
|
+
export function placeSprocket(solid, rotationDeg, loc) {
|
|
319
|
+
const rotated = rotateAbout(solid, { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } }, rotationDeg * DEG);
|
|
320
|
+
return translate(rotated, loc[0], loc[1], 0);
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain.js","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contract — 本包行为契约版本(方案 §4.2.1)
|
|
3
|
+
*
|
|
4
|
+
* 标识「API 形状 + 参数表来源版本 + STEP 输出形态」组合;与内核契约对齐
|
|
5
|
+
* (照 fai_cq_gears,勿硬编码)。改值必须显式改此文件,防止误改。
|
|
6
|
+
*/
|
|
7
|
+
/** 本包行为契约版本(方案 §4.2.1):API 形状 + 参数表来源 + STEP 输出形态;与内核契约锁定。 */
|
|
8
|
+
export declare const contractVersion = 3;
|
|
9
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,8DAA8D;AAC9D,eAAO,MAAM,eAAe,IAAmB,CAAA"}
|
package/dist/contract.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* contract — 本包行为契约版本(方案 §4.2.1)
|
|
3
|
+
*
|
|
4
|
+
* 标识「API 形状 + 参数表来源版本 + STEP 输出形态」组合;与内核契约对齐
|
|
5
|
+
* (照 fai_cq_gears,勿硬编码)。改值必须显式改此文件,防止误改。
|
|
6
|
+
*/
|
|
7
|
+
import { CONTRACT_VERSION } from '@faicad/faijs';
|
|
8
|
+
/** 本包行为契约版本(方案 §4.2.1):API 形状 + 参数表来源 + STEP 输出形态;与内核契约锁定。 */
|
|
9
|
+
export const contractVersion = CONTRACT_VERSION;
|
|
10
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"M6-1": {
|
|
3
|
+
"Hilitchi:s": 5.95,
|
|
4
|
+
"Hilitchi:m": 16.5,
|
|
5
|
+
"Hilitchi:dc": 36.3,
|
|
6
|
+
"Hilitchi:c": 2.4,
|
|
7
|
+
"Hilitchi:bcd": 24,
|
|
8
|
+
"Hilitchi:brad_size": "M4-0.7",
|
|
9
|
+
"Hilitchi:brad_num": 3
|
|
10
|
+
},
|
|
11
|
+
"M8-1.25": {
|
|
12
|
+
"Hilitchi:s": 5.95,
|
|
13
|
+
"Hilitchi:m": 16.5,
|
|
14
|
+
"Hilitchi:dc": 36,
|
|
15
|
+
"Hilitchi:c": 2,
|
|
16
|
+
"Hilitchi:bcd": 24,
|
|
17
|
+
"Hilitchi:brad_size": "M4-0.7",
|
|
18
|
+
"Hilitchi:brad_num": 3
|
|
19
|
+
},
|
|
20
|
+
"M10-1.5": {
|
|
21
|
+
"Hilitchi:s": 5.95,
|
|
22
|
+
"Hilitchi:m": 16.5,
|
|
23
|
+
"Hilitchi:dc": 36.3,
|
|
24
|
+
"Hilitchi:c": 2.4,
|
|
25
|
+
"Hilitchi:bcd": 24,
|
|
26
|
+
"Hilitchi:brad_size": "M4-0.7",
|
|
27
|
+
"Hilitchi:brad_num": 3
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"M3-0.5": {
|
|
3
|
+
"iso7380_1:dk": 5.7,
|
|
4
|
+
"iso7380_1:dl": 2.6,
|
|
5
|
+
"iso7380_1:k": 1.65,
|
|
6
|
+
"iso7380_1:rf": 3.7,
|
|
7
|
+
"iso7380_1:s": 2.08,
|
|
8
|
+
"iso7380_1:t": 1.04,
|
|
9
|
+
"iso7380_1:short": 6,
|
|
10
|
+
"iso7380_1:long": 30
|
|
11
|
+
},
|
|
12
|
+
"M4-0.7": {
|
|
13
|
+
"iso7380_1:dk": 7.6,
|
|
14
|
+
"iso7380_1:dl": 3.8,
|
|
15
|
+
"iso7380_1:k": 2.2,
|
|
16
|
+
"iso7380_1:rf": 4.6,
|
|
17
|
+
"iso7380_1:s": 2.58,
|
|
18
|
+
"iso7380_1:t": 1.3,
|
|
19
|
+
"iso7380_1:short": 6,
|
|
20
|
+
"iso7380_1:long": 40
|
|
21
|
+
},
|
|
22
|
+
"M5-0.8": {
|
|
23
|
+
"iso7380_1:dk": 9.5,
|
|
24
|
+
"iso7380_1:dl": 5,
|
|
25
|
+
"iso7380_1:k": 2.75,
|
|
26
|
+
"iso7380_1:rf": 5.75,
|
|
27
|
+
"iso7380_1:s": 3.08,
|
|
28
|
+
"iso7380_1:t": 1.56,
|
|
29
|
+
"iso7380_1:short": 8,
|
|
30
|
+
"iso7380_1:long": 50
|
|
31
|
+
},
|
|
32
|
+
"M6-1": {
|
|
33
|
+
"iso7380_1:dk": 10.5,
|
|
34
|
+
"iso7380_1:dl": 6,
|
|
35
|
+
"iso7380_1:k": 3.3,
|
|
36
|
+
"iso7380_1:rf": 6.15,
|
|
37
|
+
"iso7380_1:s": 4.095,
|
|
38
|
+
"iso7380_1:t": 2.08,
|
|
39
|
+
"iso7380_1:short": 10,
|
|
40
|
+
"iso7380_1:long": 60
|
|
41
|
+
},
|
|
42
|
+
"M8-1.25": {
|
|
43
|
+
"iso7380_1:dk": 14,
|
|
44
|
+
"iso7380_1:dl": 7.7,
|
|
45
|
+
"iso7380_1:k": 4.4,
|
|
46
|
+
"iso7380_1:rf": 7.95,
|
|
47
|
+
"iso7380_1:s": 5.14,
|
|
48
|
+
"iso7380_1:t": 2.6,
|
|
49
|
+
"iso7380_1:short": 12,
|
|
50
|
+
"iso7380_1:long": 80
|
|
51
|
+
},
|
|
52
|
+
"M10-1.5": {
|
|
53
|
+
"iso7380_1:dk": 17.5,
|
|
54
|
+
"iso7380_1:dl": 10,
|
|
55
|
+
"iso7380_1:k": 5.5,
|
|
56
|
+
"iso7380_1:rf": 9.8,
|
|
57
|
+
"iso7380_1:s": 6.14,
|
|
58
|
+
"iso7380_1:t": 3.12,
|
|
59
|
+
"iso7380_1:short": 16,
|
|
60
|
+
"iso7380_1:long": 90
|
|
61
|
+
},
|
|
62
|
+
"M12-1.75": {
|
|
63
|
+
"iso7380_1:dk": 21,
|
|
64
|
+
"iso7380_1:dl": 12,
|
|
65
|
+
"iso7380_1:k": 6.6,
|
|
66
|
+
"iso7380_1:rf": 11.2,
|
|
67
|
+
"iso7380_1:s": 8.175,
|
|
68
|
+
"iso7380_1:t": 4.16,
|
|
69
|
+
"iso7380_1:short": 20,
|
|
70
|
+
"iso7380_1:long": 90
|
|
71
|
+
},
|
|
72
|
+
"M16-2": {
|
|
73
|
+
"iso7380_1:dk": 28,
|
|
74
|
+
"iso7380_1:dl": 16,
|
|
75
|
+
"iso7380_1:k": 8.8,
|
|
76
|
+
"iso7380_1:rf": 15.3,
|
|
77
|
+
"iso7380_1:s": 10.175,
|
|
78
|
+
"iso7380_1:t": 5.2,
|
|
79
|
+
"iso7380_1:short": 25,
|
|
80
|
+
"iso7380_1:long": 90
|
|
81
|
+
}
|
|
82
|
+
}
|