@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.
Files changed (100) hide show
  1. package/dist/bearing.d.ts +81 -0
  2. package/dist/bearing.d.ts.map +1 -0
  3. package/dist/bearing.js +462 -0
  4. package/dist/bearing.js.map +1 -0
  5. package/dist/chain.d.ts +96 -0
  6. package/dist/chain.d.ts.map +1 -0
  7. package/dist/chain.js +322 -0
  8. package/dist/chain.js.map +1 -0
  9. package/dist/contract.d.ts +9 -0
  10. package/dist/contract.d.ts.map +1 -0
  11. package/dist/contract.js +10 -0
  12. package/dist/contract.js.map +1 -0
  13. package/dist/data/brad_tee_nut_parameters.json +29 -0
  14. package/dist/data/button_head_parameters.json +82 -0
  15. package/dist/data/button_head_with_collar_parameters.json +98 -0
  16. package/dist/data/chamfered_washer_parameters.json +262 -0
  17. package/dist/data/cheese_head_parameters.json +182 -0
  18. package/dist/data/cheese_head_washer_parameters.json +112 -0
  19. package/dist/data/clearance_hole_sizes.json +427 -0
  20. package/dist/data/countersunk_head_parameters.json +1752 -0
  21. package/dist/data/domed_cap_nut_parameters.json +62 -0
  22. package/dist/data/drill_sizes.json +320 -0
  23. package/dist/data/heatset_nut_parameters.json +354 -0
  24. package/dist/data/hex_head_parameters.json +408 -0
  25. package/dist/data/hex_head_with_flange_parameters.json +114 -0
  26. package/dist/data/hex_nut_parameters.json +250 -0
  27. package/dist/data/hex_nut_with_flange_parameters.json +92 -0
  28. package/dist/data/imperial_set_screw_parameters.json +150 -0
  29. package/dist/data/iso10664def.json +82 -0
  30. package/dist/data/metric_set_screw_parameters.json +50 -0
  31. package/dist/data/nominal_screw_lengths.json +106 -0
  32. package/dist/data/pan_head_parameters.json +322 -0
  33. package/dist/data/pan_head_with_collar_parameters.json +56 -0
  34. package/dist/data/plain_washer_parameters.json +464 -0
  35. package/dist/data/raised_cheese_head_parameters.json +82 -0
  36. package/dist/data/raised_countersunk_oval_head_parameters.json +314 -0
  37. package/dist/data/setscrew_parameters.json +110 -0
  38. package/dist/data/single_row_angular_contact_ball_bearing_parameters.json +209 -0
  39. package/dist/data/single_row_capped_deep_groove_ball_bearing_parameters.json +527 -0
  40. package/dist/data/single_row_cylindrical_roller_bearing_parameters.json +227 -0
  41. package/dist/data/single_row_deep_groove_ball_bearing_parameters.json +653 -0
  42. package/dist/data/single_row_tapered_roller_bearing_parameters.json +756 -0
  43. package/dist/data/socket_head_cap_parameters.json +856 -0
  44. package/dist/data/square_nut_parameters.json +26 -0
  45. package/dist/data/tap_hole_sizes.json +398 -0
  46. package/dist/data/tapered-fillet-drop.json +109 -0
  47. package/dist/data/unchamfered_hex_nut_parameters.json +42 -0
  48. package/dist/holes.d.ts +186 -0
  49. package/dist/holes.d.ts.map +1 -0
  50. package/dist/holes.js +197 -0
  51. package/dist/holes.js.map +1 -0
  52. package/dist/index.d.ts +27 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +36 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/kernel.d.ts +117 -0
  57. package/dist/kernel.d.ts.map +1 -0
  58. package/dist/kernel.js +25 -0
  59. package/dist/kernel.js.map +1 -0
  60. package/dist/measure.d.ts +52 -0
  61. package/dist/measure.d.ts.map +1 -0
  62. package/dist/measure.js +158 -0
  63. package/dist/measure.js.map +1 -0
  64. package/dist/nut.d.ts +315 -0
  65. package/dist/nut.d.ts.map +1 -0
  66. package/dist/nut.js +700 -0
  67. package/dist/nut.js.map +1 -0
  68. package/dist/params.d.ts +178 -0
  69. package/dist/params.d.ts.map +1 -0
  70. package/dist/params.js +330 -0
  71. package/dist/params.js.map +1 -0
  72. package/dist/primitives.d.ts +440 -0
  73. package/dist/primitives.d.ts.map +1 -0
  74. package/dist/primitives.js +597 -0
  75. package/dist/primitives.js.map +1 -0
  76. package/dist/recess.d.ts +129 -0
  77. package/dist/recess.d.ts.map +1 -0
  78. package/dist/recess.js +323 -0
  79. package/dist/recess.js.map +1 -0
  80. package/dist/screw.d.ts +101 -0
  81. package/dist/screw.d.ts.map +1 -0
  82. package/dist/screw.js +945 -0
  83. package/dist/screw.js.map +1 -0
  84. package/dist/sprocket.d.ts +135 -0
  85. package/dist/sprocket.d.ts.map +1 -0
  86. package/dist/sprocket.js +261 -0
  87. package/dist/sprocket.js.map +1 -0
  88. package/dist/test-setup.d.ts +11 -0
  89. package/dist/test-setup.d.ts.map +1 -0
  90. package/dist/test-setup.js +30 -0
  91. package/dist/test-setup.js.map +1 -0
  92. package/dist/thread.d.ts +189 -0
  93. package/dist/thread.d.ts.map +1 -0
  94. package/dist/thread.js +501 -0
  95. package/dist/thread.js.map +1 -0
  96. package/dist/washer.d.ts +126 -0
  97. package/dist/washer.d.ts.map +1 -0
  98. package/dist/washer.js +204 -0
  99. package/dist/washer.js.map +1 -0
  100. package/package.json +55 -0
@@ -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"}
@@ -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
+ }