@faicad/faijs-fasteners 0.29.3

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 (104) hide show
  1. package/LICENSE +202 -0
  2. package/README.i18n.yaml +6 -0
  3. package/README.md +16 -0
  4. package/README.zh.md +16 -0
  5. package/dist/bearing.d.ts +81 -0
  6. package/dist/bearing.d.ts.map +1 -0
  7. package/dist/bearing.js +462 -0
  8. package/dist/bearing.js.map +1 -0
  9. package/dist/chain.d.ts +96 -0
  10. package/dist/chain.d.ts.map +1 -0
  11. package/dist/chain.js +322 -0
  12. package/dist/chain.js.map +1 -0
  13. package/dist/contract.d.ts +9 -0
  14. package/dist/contract.d.ts.map +1 -0
  15. package/dist/contract.js +10 -0
  16. package/dist/contract.js.map +1 -0
  17. package/dist/data/brad_tee_nut_parameters.json +29 -0
  18. package/dist/data/button_head_parameters.json +82 -0
  19. package/dist/data/button_head_with_collar_parameters.json +98 -0
  20. package/dist/data/chamfered_washer_parameters.json +262 -0
  21. package/dist/data/cheese_head_parameters.json +182 -0
  22. package/dist/data/cheese_head_washer_parameters.json +112 -0
  23. package/dist/data/clearance_hole_sizes.json +427 -0
  24. package/dist/data/countersunk_head_parameters.json +1752 -0
  25. package/dist/data/domed_cap_nut_parameters.json +62 -0
  26. package/dist/data/drill_sizes.json +320 -0
  27. package/dist/data/heatset_nut_parameters.json +354 -0
  28. package/dist/data/hex_head_parameters.json +408 -0
  29. package/dist/data/hex_head_with_flange_parameters.json +114 -0
  30. package/dist/data/hex_nut_parameters.json +250 -0
  31. package/dist/data/hex_nut_with_flange_parameters.json +92 -0
  32. package/dist/data/imperial_set_screw_parameters.json +150 -0
  33. package/dist/data/iso10664def.json +82 -0
  34. package/dist/data/metric_set_screw_parameters.json +50 -0
  35. package/dist/data/nominal_screw_lengths.json +106 -0
  36. package/dist/data/pan_head_parameters.json +322 -0
  37. package/dist/data/pan_head_with_collar_parameters.json +56 -0
  38. package/dist/data/plain_washer_parameters.json +464 -0
  39. package/dist/data/raised_cheese_head_parameters.json +82 -0
  40. package/dist/data/raised_countersunk_oval_head_parameters.json +314 -0
  41. package/dist/data/setscrew_parameters.json +110 -0
  42. package/dist/data/single_row_angular_contact_ball_bearing_parameters.json +209 -0
  43. package/dist/data/single_row_capped_deep_groove_ball_bearing_parameters.json +527 -0
  44. package/dist/data/single_row_cylindrical_roller_bearing_parameters.json +227 -0
  45. package/dist/data/single_row_deep_groove_ball_bearing_parameters.json +653 -0
  46. package/dist/data/single_row_tapered_roller_bearing_parameters.json +756 -0
  47. package/dist/data/socket_head_cap_parameters.json +856 -0
  48. package/dist/data/square_nut_parameters.json +26 -0
  49. package/dist/data/tap_hole_sizes.json +398 -0
  50. package/dist/data/tapered-fillet-drop.json +109 -0
  51. package/dist/data/unchamfered_hex_nut_parameters.json +42 -0
  52. package/dist/holes.d.ts +186 -0
  53. package/dist/holes.d.ts.map +1 -0
  54. package/dist/holes.js +197 -0
  55. package/dist/holes.js.map +1 -0
  56. package/dist/index.d.ts +27 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +36 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/kernel.d.ts +122 -0
  61. package/dist/kernel.d.ts.map +1 -0
  62. package/dist/kernel.js +25 -0
  63. package/dist/kernel.js.map +1 -0
  64. package/dist/measure.d.ts +53 -0
  65. package/dist/measure.d.ts.map +1 -0
  66. package/dist/measure.js +160 -0
  67. package/dist/measure.js.map +1 -0
  68. package/dist/nut.d.ts +315 -0
  69. package/dist/nut.d.ts.map +1 -0
  70. package/dist/nut.js +700 -0
  71. package/dist/nut.js.map +1 -0
  72. package/dist/params.d.ts +178 -0
  73. package/dist/params.d.ts.map +1 -0
  74. package/dist/params.js +330 -0
  75. package/dist/params.js.map +1 -0
  76. package/dist/primitives.d.ts +440 -0
  77. package/dist/primitives.d.ts.map +1 -0
  78. package/dist/primitives.js +597 -0
  79. package/dist/primitives.js.map +1 -0
  80. package/dist/recess.d.ts +129 -0
  81. package/dist/recess.d.ts.map +1 -0
  82. package/dist/recess.js +323 -0
  83. package/dist/recess.js.map +1 -0
  84. package/dist/screw.d.ts +101 -0
  85. package/dist/screw.d.ts.map +1 -0
  86. package/dist/screw.js +945 -0
  87. package/dist/screw.js.map +1 -0
  88. package/dist/sprocket.d.ts +135 -0
  89. package/dist/sprocket.d.ts.map +1 -0
  90. package/dist/sprocket.js +261 -0
  91. package/dist/sprocket.js.map +1 -0
  92. package/dist/test-setup.d.ts +11 -0
  93. package/dist/test-setup.d.ts.map +1 -0
  94. package/dist/test-setup.js +30 -0
  95. package/dist/test-setup.js.map +1 -0
  96. package/dist/thread.d.ts +189 -0
  97. package/dist/thread.d.ts.map +1 -0
  98. package/dist/thread.js +501 -0
  99. package/dist/thread.js.map +1 -0
  100. package/dist/washer.d.ts +126 -0
  101. package/dist/washer.d.ts.map +1 -0
  102. package/dist/washer.js +204 -0
  103. package/dist/washer.js.map +1 -0
  104. package/package.json +58 -0
@@ -0,0 +1,462 @@
1
+ // Copyright 2026 Faicad. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ /**
5
+ * bearing.ts — 轴承 5 类(W6)—— 上游 `cq_warehouse.bearing.Bearing` 基类 +
6
+ * 5 个子类的逐位复刻。
7
+ *
8
+ * 装配流(`bearing.py:223 make_bearing`):
9
+ * ```
10
+ * outer_race = revolve(outer_race_section) # XZ 平面轮廓绕 Z 旋 360°
11
+ * inner_race = revolve(inner_race_section)
12
+ * bearing = outer.fuse(inner)
13
+ * if capped: bearing = bearing.fuse(cap).fuse(cap.mirror("XY").translate((0,0,B)))
14
+ * else: for each roller in polarArray(race_center_radius, N):
15
+ * bearing = bearing.fuse(roller.located(Location((0,0,B/2))))
16
+ * if cage: bearing = bearing.fuse(cage)
17
+ * ```
18
+ * 滚子(roller):深沟球/角接触 = 球;圆柱滚子 = 圆柱;圆锥滚子 = 圆锥(绕 X 倾
19
+ * `roller_axis_angle`)。
20
+ *
21
+ * 几何坐标:轮廓画在 XZ 平面(局部 x → 世界 X=半径、局部 y → 世界 +Z),
22
+ * `revolveProfile` 绕 Z 轴 360°。滚子阵列在 XY 平面内半径 `race_center_radius`
23
+ * 处,整体抬升到 `z = B/2`(与上游 `polarArray` + `Location((0,0,B/2))` 完全同构)。
24
+ *
25
+ * ⚠️ **两条本阶段首次确认、并由 `scripts/kernel-bearing-probe.py` 实测锁定的复刻事实**:
26
+ * 1. `Sketch.trapezoid(w,h,a1,a2,angle)`(`sketch.py:284`)经 `.push((cx,cy))` 平移 +
27
+ * `.faces()[0].rotate(Y, −90)` 映射成 (半径=|Y|, z=X) 的凸四边形,其中 `angle`
28
+ * 是绕 Z 的**整体旋转**(不是 a2)。`cup` 用 `angle=90°`、`cone` 用 `angle=−90°`,
29
+ * 两者 a2 恒为 90°,故 v4 的 `h/tan(a2)` 项恒为 0。四角 line-line 圆角(r34/r12)
30
+ * 用本文件的 `lineLineFillet` 精确解,与上游 `vertices().fillet()` 在凸四边形上等价。
31
+ * 2. **圆锥滚子的 `roller_diameter` 是几何测量值**:上游 `roller.faces(">Z").edges()
32
+ * .val().radius()*2.5`,即锥顶(z=B/2 处)那一圈半径 ×2.5;本包直接算
33
+ * `2.5·cone_radii[0]`(cone_radii[0] 是 `makeCone` 顶端半径),无需真建锥再量。
34
+ * 3. **上游 `cone_length` 的著名 quirk**:`(Db/2)/asin(radians(a))`(用了 `asin`
35
+ * 而非 `sin`),`cone_angle` 与 `race_center_radius` 都依赖于此——必须逐字复刻,
36
+ * 否则圆锥几何整体偏移。已写入本文件并在探针中数字比对一致。
37
+ */
38
+ import { arcEdge, cone, cut, cylinderBetween, fuse, interpolateEdgeWithTangents, lineEdge, mirrorAbout, planarFace, revolveProfile, rotateAbout, translate as translateShape, wireFromEdges, } from './primitives.js';
39
+ import { BEARING_TABLES, isolateFastenerType, } from './params.js';
40
+ import TAPERED_FILLET_DROP from './data/tapered-fillet-drop.json';
41
+ const DEG = Math.PI / 180;
42
+ const TWO_PI = 2 * Math.PI;
43
+ /** 旋转轴(Z 轴)——上游 `Workplane("XZ").revolve()` 的隐式轴。 */
44
+ const AXIS_Z = { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } };
45
+ /** 绕 X 轴旋转(圆锥滚子倾角)。 */
46
+ const AXIS_X = { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } };
47
+ /** `num(row)`:轴承参数表取数(`isolateFastenerType` 已在生成期求值,运行期只收窄)。 */
48
+ function num(row, key, where) {
49
+ const v = row[key];
50
+ if (typeof v !== 'number')
51
+ throw new Error(`${where}: bearing_data["${key}"] is not numeric (got ${JSON.stringify(v)})`);
52
+ return v;
53
+ }
54
+ /** 局部 (x,y) → 世界 3D(局部 x→X=半径、局部 y→Z)。 */
55
+ function v3(p) {
56
+ return { x: p.x, y: 0, z: p.y };
57
+ }
58
+ /**
59
+ * 查 tapered-fillet-drop.json 行为表:该尺寸的 cup 是否被上游丢 (r=D/2, h=C) 圆角。
60
+ * 表由 `scripts/gen-fillet-drop.py` 在 cadquery 环境实测生成(A 侧真值,非启发式)。
61
+ * @param size - 轴承规格(如 `M17-40-13.25`)。
62
+ * @returns 丢角为 true;非 tapered 尺寸/表外尺寸恒 false(仅 tapered cup 调用)。
63
+ */
64
+ function dropsTopOuterCorner(size) {
65
+ const hit = TAPERED_FILLET_DROP.sizes.find((r) => r.size === size);
66
+ return hit?.drop_top_outer ?? false;
67
+ }
68
+ /** 段列(XZ 轮廓)→ 封闭 wire → 绕 Z 旋成实体。 */
69
+ function revolveProfileEdges(edges) {
70
+ return revolveProfile(planarFace(wireFromEdges(edges)), AXIS_Z, TWO_PI);
71
+ }
72
+ /** 直线段 edge。 */
73
+ function eLine(a, b) {
74
+ return lineEdge(v3(a), v3(b));
75
+ }
76
+ /** 圆弧段 edge(cq `radiusArc`,radius 带符号决定凸向,与上游逐字一致)。 */
77
+ function eArc(a, b, radius) {
78
+ // 圆弧中点用与 cq `radiusArcMidpoint` 一致的带符号 sagitta 解(见 screw.ts)。
79
+ const dx = b.x - a.x;
80
+ const dy = b.y - a.y;
81
+ const len = Math.hypot(dx, dy) / 2;
82
+ const r2l2 = radius * radius - len * len;
83
+ let sag = Math.abs(radius);
84
+ if (Math.abs(r2l2) >= 1e-7)
85
+ sag -= Math.sqrt(Math.max(0, r2l2));
86
+ const ux = dx / (2 * len);
87
+ const uy = dy / (2 * len);
88
+ const sx = radius > 0 ? -uy * sag : uy * sag;
89
+ const sy = radius > 0 ? ux * sag : -ux * sag;
90
+ const mid = { x: (a.x + b.x) / 2 + sx, y: (a.y + b.y) / 2 + sy };
91
+ return arcEdge(v3(a), v3(mid), v3(b));
92
+ }
93
+ /** 插值样条段 edge(cq `spline(tangents=[t0,t1])`)。tangents 为 2D(局部 x→X、y→Z)。 */
94
+ function eSpline(a, b, t0, t1) {
95
+ return interpolateEdgeWithTangents([v3(a), v3(b)], { x: t0.x, y: 0, z: t0.y }, { x: t1.x, y: 0, z: t1.y });
96
+ }
97
+ /** 直线-直线角圆角(cq `Wire.fillet2D` 的线-线角闭式)。 */
98
+ function lineLineFillet(corner, inDir, outDir, r) {
99
+ const u1 = { x: -inDir.x, y: -inDir.y };
100
+ const cosT = u1.x * outDir.x + u1.y * outDir.y;
101
+ const theta = Math.acos(Math.max(-1, Math.min(1, cosT)));
102
+ const t = r / Math.tan(theta / 2);
103
+ const bis = { x: u1.x + outDir.x, y: u1.y + outDir.y };
104
+ const bl = Math.hypot(bis.x, bis.y) || 1;
105
+ const bn = { x: bis.x / bl, y: bis.y / bl };
106
+ const cdist = r / Math.sin(theta / 2);
107
+ const ctr = { x: corner.x + bn.x * cdist, y: corner.y + bn.y * cdist };
108
+ const near = { x: corner.x - ctr.x, y: corner.y - ctr.y };
109
+ const nl = Math.hypot(near.x, near.y) || 1;
110
+ const mid = { x: ctr.x + (near.x / nl) * r, y: ctr.y + (near.y / nl) * r };
111
+ return {
112
+ p1: { x: corner.x + u1.x * t, y: corner.y + u1.y * t },
113
+ p2: { x: corner.x + outDir.x * t, y: corner.y + outDir.y * t },
114
+ mid,
115
+ };
116
+ }
117
+ function unit(v) {
118
+ const l = Math.hypot(v.x, v.y) || 1;
119
+ return { x: v.x / l, y: v.y / l };
120
+ }
121
+ /**
122
+ * 闭合多边形(凸四边形/矩形)带四角 line-line 圆角的轮廓 wire。
123
+ * @param corners - 角点(按轮廓序,凸多边形,闭合)。
124
+ * @param radii - 每个角点的圆角半径(与 corners 等长);为 0 表示尖角(不倒圆)。
125
+ * @param skip - 需要保留尖角(跳过倒圆)的角点索引集合。上游
126
+ * `Sketch.vertices().fillet(r34)` 对 tapered cup 在部分尺寸上会静默丢弃
127
+ * (r=D/2, h=C) 角的圆角(OCC `BRepFilletAPI_MakeFillet2d` quirk,无闭式
128
+ * 分界,14/26 尺寸触发,见 W6 分析文档);该行为由 A 侧行为表
129
+ * `src/data/tapered-fillet-drop.json` 数据驱动,禁止启发式。
130
+ * @returns 倒角后的 edge 列(已闭合)。
131
+ */
132
+ function filletedPolygonEdges(corners, radii, skip = new Set()) {
133
+ const n = corners.length;
134
+ const p1 = [];
135
+ const p2 = [];
136
+ const mid = [];
137
+ for (let i = 0; i < n; i++) {
138
+ if (skip.has(i) || Math.abs(radii[i] ?? 0) <= 1e-9) {
139
+ p1.push(corners[i]);
140
+ p2.push(corners[i]);
141
+ mid.push(corners[i]);
142
+ continue;
143
+ }
144
+ const prev = corners[(i - 1 + n) % n];
145
+ const cur = corners[i];
146
+ const next = corners[(i + 1) % n];
147
+ const inDir = unit({ x: cur.x - prev.x, y: cur.y - prev.y });
148
+ const outDir = unit({ x: next.x - cur.x, y: next.y - cur.y });
149
+ const g = lineLineFillet(cur, inDir, outDir, radii[i]);
150
+ p1.push(g.p1);
151
+ p2.push(g.p2);
152
+ mid.push(g.mid);
153
+ }
154
+ const edges = [];
155
+ for (let i = 0; i < n; i++) {
156
+ const j = (i + 1) % n;
157
+ // 本角出边:从 p2[i] 到下一角的 p1[j](p 相同时 filletedPolygonEdges 已跳过圆角)
158
+ edges.push(eLine(p2[i], p1[j]));
159
+ // 下一角圆角弧:p1[j] → mid[j] → p2[j](用显式中点,避免 sign 歧义)
160
+ if (!skip.has(j) && Math.abs(radii[j]) > 1e-9) {
161
+ edges.push(arcEdge(v3(p1[j]), v3(mid[j]), v3(p2[j])));
162
+ }
163
+ }
164
+ return edges;
165
+ }
166
+ // ── 滚道截面(revolve 前的 XZ 轮廓) ───────────────────────────────────────
167
+ /** 默认滚道截面:矩形(x∈[x0,x1], y∈[0,h])四角圆角 r(深沟球/圆柱滚子用)。 */
168
+ function defaultRaceEdges(x0, x1, h, r) {
169
+ const c = [
170
+ { x: x0, y: 0 },
171
+ { x: x1, y: 0 },
172
+ { x: x1, y: h },
173
+ { x: x0, y: h },
174
+ ];
175
+ return filletedPolygonEdges(c, [r, r, r, r]);
176
+ }
177
+ /** 角接触轴承内圈截面(custom,spline+arc);与 `bearing.py:401` 逐点一致。 */
178
+ function angularInnerEdges(d, d1, d2, r12, B) {
179
+ const S0 = { x: d2 / 2 - r12, y: 0 };
180
+ const A1 = { x: d2 / 2, y: r12 };
181
+ const A2 = { x: d1 / 2, y: B - r12 };
182
+ const A3 = { x: d1 / 2 - r12, y: B };
183
+ const A4 = { x: d / 2 + r12, y: B };
184
+ const A5 = { x: d / 2, y: B - r12 };
185
+ const A6 = { x: d / 2, y: r12 };
186
+ const A7 = { x: d / 2 + r12, y: 0 };
187
+ return [
188
+ eArc(S0, A1, -r12),
189
+ eSpline(A1, A2, { x: 0, y: 1 }, { x: 0, y: 1 }),
190
+ eArc(A2, A3, -r12),
191
+ eLine(A3, A4),
192
+ eArc(A4, A5, -r12),
193
+ eLine(A5, A6),
194
+ eArc(A6, A7, -r12),
195
+ eLine(A7, S0),
196
+ ];
197
+ }
198
+ /** 角接触轴承外圈截面(custom,spline+arc);与 `bearing.py:420` 逐点一致。 */
199
+ function angularOuterEdges(d, D, D1, d2, r12, r34, B) {
200
+ const D2 = D - (d2 - d);
201
+ const S0 = { x: D / 2 - r12, y: 0 };
202
+ const A1 = { x: D / 2, y: r12 };
203
+ const A2 = { x: D / 2, y: B - r34 };
204
+ const A3 = { x: D / 2 - r34, y: B };
205
+ const A4 = { x: D2 / 2 + r12, y: B };
206
+ const A5 = { x: D2 / 2, y: B - r12 };
207
+ const A6 = { x: D1 / 2, y: r12 };
208
+ const A7 = { x: D1 / 2 + r12, y: 0 };
209
+ return [
210
+ eArc(S0, A1, -r12),
211
+ eLine(A1, A2),
212
+ eArc(A2, A3, -r34),
213
+ eLine(A3, A4),
214
+ eArc(A4, A5, -r12),
215
+ eSpline(A5, A6, { x: 0, y: -1 }, { x: 0, y: -1 }),
216
+ eArc(A6, A7, -r12),
217
+ eLine(A7, S0),
218
+ ];
219
+ }
220
+ /**
221
+ * 圆锥轴承外圈(cup)截面:trapezoid 经 `sketch.py:284` 顶点公式 + 整体 `angle=90°`
222
+ * 旋转 + `rotate(Y,−90)` 映射成 (半径=|Y|, z=X) 后的凸四边形,四角圆角 r34。
223
+ * 闭式由 `scripts/kernel-bearing-probe.py` 对照 cadquery 实测锁定(CUP match=True)。
224
+ * @param D - 外径。@param C - cup 高度。@param Db - Dbmin(小端直径)。
225
+ * @param a - 接触角(度)。@param r34 - 圆角半径。
226
+ */
227
+ function taperedCupEdges(D, C, Db, a, r34, dropTopOuter) {
228
+ const w = (D - Db) / 2;
229
+ const h = C;
230
+ const cx = C / 2;
231
+ const cy = D / 2 - (D - Db) / 4;
232
+ // 角点序 (V1,V2,V4,V3) 与上游 trapezoid polygon(v1,v2,v4,v3) 一致;
233
+ // 半径 = |y'|、高度 = x'(x',y' 为平移后坐标,y' 对本类恒正)。
234
+ const v1 = { x: Math.abs(cy - w / 2), y: cx + h / 2 };
235
+ const v2 = { x: Math.abs(cy + w / 2), y: cx + h / 2 };
236
+ const v4 = { x: Math.abs(cy + w / 2), y: cx - h / 2 };
237
+ // a1 = a+90 → 1/tan(a1) = −tan(a),故 V3 半径 = cy − w/2 − h·tan(a)
238
+ const v3 = { x: Math.abs(cy - w / 2 - h * Math.tan(a * DEG)), y: cx - h / 2 };
239
+ // V2 = (r=D/2, h=C) 顶边-外圆柱角:上游 `vertices().fillet(r34)` 在部分尺寸
240
+ // 静默丢它的圆角(OCC MakeFillet2d quirk)——由 tapered-fillet-drop.json 行为表驱动。
241
+ const skip = dropTopOuter ? new Set([1]) : new Set();
242
+ return filletedPolygonEdges([v1, v2, v4, v3], [r34, r34, r34, r34], skip);
243
+ }
244
+ /**
245
+ * 圆锥轴承内圈(cone)截面的角点(radius=x, height=y)由 `buildBearing` 的 tapered
246
+ * 分支内联构造——因为 cx = T − B/2 依赖 T,闭式由 `scripts/kernel-bearing-probe.py`
247
+ * 对照 cadquery 实测锁定(CONE match=True):
248
+ * V1=(|cy+w/2|, cx−B/2), V2=(|cy−w/2|, cx−B/2),
249
+ * V4=(|cy−w/2|, cx+B/2), V3=(|cy+w/2−B·tan(90+coneAngle), cx+B/2),
250
+ * cy = d/2 + (da−d)/2, cx = T − B/2。
251
+ */
252
+ /**
253
+ * 球滚子(半圆盘 revolve → 实体球)。
254
+ * @param radius - 球半径。
255
+ * @returns 球体 BREP 句柄。
256
+ */
257
+ export function sphere(radius) {
258
+ const A = { x: 0, y: 0, z: radius };
259
+ const M = { x: radius, y: 0, z: 0 };
260
+ const B = { x: 0, y: 0, z: -radius };
261
+ // 半圆 (A→M→B) + 直径闭合线,构成半盘 face,revolve 360° → 完整球。
262
+ return revolveProfileEdges([arcEdge(A, M, B), lineEdge(B, A)]);
263
+ }
264
+ /** 圆柱滚子(轴向 +Z,居中)。 */
265
+ function cylinderRoller(radius, length) {
266
+ return cylinderBetween(radius, -length / 2, length / 2);
267
+ }
268
+ /** 圆锥滚子(锥轴 +Z,居中,再绕 X 倾 `axisAngle` 度)。 */
269
+ function coneRoller(rBottom, rTop, length, axisAngle) {
270
+ const c = translateShape(cone(rBottom, rTop, length), 0, 0, -length / 2);
271
+ return rotateAbout(c, AXIS_X, -axisAngle * DEG);
272
+ }
273
+ /** 密封盖环形(revolve 矩形截面 → 短管),落位于 z∈[B/20, 2·B/20]。 */
274
+ function capRing(rInner, rOuter, B) {
275
+ const base = revolveProfileEdges(defaultRaceEdges(rInner, rOuter, B / 20, 0));
276
+ return translateShape(base, 0, 0, B / 20);
277
+ }
278
+ // ── 轴承参数解析与派生量 ────────────────────────────────────────────────────
279
+ /** 解析轴承参数 dict(size → 剥离 `SKT:` 前缀的逐尺寸行,运行期只读数字维度)。 */
280
+ function resolveBearing(className, bearingType, size) {
281
+ const isolated = isolateFastenerType(bearingType, BEARING_TABLES[className]);
282
+ const row = isolated[size];
283
+ if (!row)
284
+ throw new Error(`bearing ${className}/${bearingType}: size ${size} not found`);
285
+ return row;
286
+ }
287
+ /** 5 类轴承的 W6 验收清单(方案 §8-W6)。 */
288
+ export const BEARING_CLASSES = [
289
+ 'SingleRowDeepGrooveBallBearing',
290
+ 'SingleRowCappedDeepGrooveBallBearing',
291
+ 'SingleRowAngularContactBallBearing',
292
+ 'SingleRowCylindricalRollerBearing',
293
+ 'SingleRowTaperedRollerBearing',
294
+ ];
295
+ /** 圆锥滚子中心半径(cage 用,与上游 `cage()` 同式)。 */
296
+ function cageRadius(coneLength, rollerAxisAngle, l) {
297
+ return (coneLength - l) * Math.sin(rollerAxisAngle * DEG) + 0.5;
298
+ }
299
+ /**
300
+ * 构造一个轴承(5 类统一入口)。
301
+ * @param className - 轴承类名。
302
+ * @param p - 构造入参(size / bearing_type)。
303
+ * @returns 轴承实体与上游派生量。
304
+ */
305
+ export function buildBearing(className, p) {
306
+ const row = resolveBearing(className, p.bearingType, p.size);
307
+ const d = num(row, 'd', className);
308
+ const D = num(row, 'D', className);
309
+ const B = num(row, 'B', className);
310
+ let innerEdges;
311
+ let outerEdges;
312
+ let roller;
313
+ let rollerDiameter;
314
+ let raceCenterRadius;
315
+ let capped = false;
316
+ let cage = false;
317
+ let T = B;
318
+ switch (className) {
319
+ case 'SingleRowDeepGrooveBallBearing':
320
+ case 'SingleRowCappedDeepGrooveBallBearing': {
321
+ const D1 = num(row, 'D1', className);
322
+ const d1 = num(row, 'd1', className);
323
+ const r12 = num(row, 'r12', className);
324
+ innerEdges = defaultRaceEdges(d / 2, d1 / 2, B, r12);
325
+ outerEdges = defaultRaceEdges(D / 2, D1 / 2, B, r12);
326
+ rollerDiameter = 0.625 * (D1 - d1);
327
+ raceCenterRadius = (D1 + d1) / 4;
328
+ roller = sphere(rollerDiameter / 2);
329
+ capped = className === 'SingleRowCappedDeepGrooveBallBearing';
330
+ break;
331
+ }
332
+ case 'SingleRowAngularContactBallBearing': {
333
+ const D1 = num(row, 'D1', className);
334
+ const d1 = num(row, 'd1', className);
335
+ const d2 = num(row, 'd2', className);
336
+ const r12 = num(row, 'r12', className);
337
+ const r34 = num(row, 'r34', className);
338
+ innerEdges = angularInnerEdges(d, d1, d2, r12, B);
339
+ outerEdges = angularOuterEdges(d, D, D1, d2, r12, r34, B);
340
+ // 上游 0.4 * (D2 − d2),D2 = D − (d2 − d)
341
+ rollerDiameter = 0.4 * (D - (d2 - d) - d2);
342
+ raceCenterRadius = (D1 + d1) / 4;
343
+ roller = sphere(rollerDiameter / 2);
344
+ capped = true;
345
+ break;
346
+ }
347
+ case 'SingleRowCylindricalRollerBearing': {
348
+ const D1 = num(row, 'D1', className);
349
+ const d1 = num(row, 'd1', className);
350
+ const r12 = num(row, 'r12', className);
351
+ innerEdges = defaultRaceEdges(d / 2, d1 / 2, B, r12);
352
+ outerEdges = defaultRaceEdges(D / 2, D1 / 2, B, r12);
353
+ rollerDiameter = 0.625 * (D1 - d1);
354
+ raceCenterRadius = (D1 + d1) / 4;
355
+ const rollerLength = 0.7 * B;
356
+ roller = cylinderRoller(rollerDiameter / 2, rollerLength);
357
+ break;
358
+ }
359
+ case 'SingleRowTaperedRollerBearing': {
360
+ const C = num(row, 'C', className);
361
+ const Db = num(row, 'Dbmin', className);
362
+ const a = num(row, 'a', className);
363
+ const r12 = num(row, 'r12', className);
364
+ const r34 = num(row, 'r34', className);
365
+ const d1 = num(row, 'd1', className);
366
+ const da = num(row, 'da', className);
367
+ T = num(row, 'T', className);
368
+ // ⚠️ 上游 quirk:cone_length = (Db/2) / asin(radians(a))(asin 非 sin)
369
+ const coneLength = (Db / 2) / Math.asin(a * DEG);
370
+ const coneAngle = Math.asin((d1 / 2) / coneLength) / DEG;
371
+ const rollerAxisAngle = (a + coneAngle) / 2;
372
+ const rollerLength = 0.7 * B;
373
+ const rollerConeAngle = a - coneAngle;
374
+ const coneRadii = [
375
+ 1.2 * (coneLength - 0) * Math.sin((rollerConeAngle * DEG) / 2),
376
+ 1.2 * (coneLength - rollerLength) * Math.sin((rollerConeAngle * DEG) / 2),
377
+ ];
378
+ rollerDiameter = 2.5 * coneRadii[0];
379
+ raceCenterRadius = (coneLength - rollerLength / 2) * Math.sin(rollerAxisAngle * DEG);
380
+ // 内圈(cone)截面:cx = T − B/2(上游 push((T − B/2, ...)))
381
+ const w = (da - d) / 2;
382
+ const cyc = d / 2 + (da - d) / 2;
383
+ const a1 = 90 + coneAngle;
384
+ const cxCone = T - B / 2;
385
+ const cV1 = { x: Math.abs(cyc + w / 2), y: cxCone - B / 2 };
386
+ const cV2 = { x: Math.abs(cyc - w / 2), y: cxCone - B / 2 };
387
+ const cV4 = { x: Math.abs(cyc - w / 2), y: cxCone + B / 2 };
388
+ const cV3 = { x: Math.abs(cyc + w / 2 - B / Math.tan(a1 * DEG)), y: cxCone + B / 2 };
389
+ innerEdges = filletedPolygonEdges([cV1, cV2, cV4, cV3], [r12, r12, r12, r12]);
390
+ outerEdges = taperedCupEdges(D, C, Db, a, r34, dropsTopOuterCorner(p.size));
391
+ roller = coneRoller(coneRadii[1], coneRadii[0], rollerLength, rollerAxisAngle);
392
+ cage = true;
393
+ break;
394
+ }
395
+ default:
396
+ throw new Error(`buildBearing: unhandled class ${className}`);
397
+ }
398
+ const inner = revolveProfileEdges(innerEdges);
399
+ const outer = revolveProfileEdges(outerEdges);
400
+ let bearing = fuse(outer, inner);
401
+ const rollerCount = Math.floor((1.8 * Math.PI * raceCenterRadius) / rollerDiameter);
402
+ if (capped) {
403
+ let rIn = d / 2;
404
+ let rOut = D / 2;
405
+ if (className === 'SingleRowAngularContactBallBearing') {
406
+ const d2 = num(row, 'd2', className);
407
+ rIn = d2 / 2;
408
+ rOut = (D - (d2 - d)) / 2;
409
+ }
410
+ const cap1 = capRing(rIn, rOut, B);
411
+ const cap2 = translateShape(mirrorAbout(cap1, { x: 0, y: 0, z: 0 }, { x: 0, y: 0, z: 1 }), 0, 0, B);
412
+ bearing = fuse(bearing, cap1);
413
+ bearing = fuse(bearing, cap2);
414
+ }
415
+ else {
416
+ for (let i = 0; i < rollerCount; i++) {
417
+ const ang = (TWO_PI * i) / rollerCount;
418
+ const pos = {
419
+ x: raceCenterRadius * Math.cos(ang),
420
+ y: raceCenterRadius * Math.sin(ang),
421
+ z: B / 2,
422
+ };
423
+ // 上游 `polarArray(...).vals()` 的 Location 自带 `Rz(ang)` 自旋
424
+ // (cq.py polarArray rotate=True 默认)——滚子先绕 Z 转到该方位,再平移落位。
425
+ // 对球/圆柱滚子无影响(绕自身对称轴),对圆锥滚子决定倾斜朝向,必须复刻。
426
+ const placed = translateShape(rotateAbout(roller, AXIS_Z, ang), pos.x, pos.y, pos.z);
427
+ bearing = fuse(bearing, placed);
428
+ }
429
+ if (cage) {
430
+ const thickness = 0.9 * T;
431
+ const cr0 = cageRadius(coneLengthForTapered(row, className), rollerAxisAngleForTapered(row, className), 0);
432
+ const cr1 = cageRadius(coneLengthForTapered(row, className), rollerAxisAngleForTapered(row, className), thickness);
433
+ const cageOuter = cone(cr1, cr0, thickness);
434
+ const cageInner = cone(cr1 - 1, cr0 - 1, thickness);
435
+ bearing = fuse(bearing, cut(cageOuter, cageInner));
436
+ }
437
+ }
438
+ return {
439
+ handle: bearing,
440
+ boreDiameter: d,
441
+ outerDiameter: D,
442
+ thickness: T,
443
+ rollerDiameter,
444
+ raceCenterRadius,
445
+ rollerCount,
446
+ };
447
+ }
448
+ /** 圆锥派生量(与 buildBearing 内同式,供 cage 半径复用)。 */
449
+ function coneLengthForTapered(row, className) {
450
+ const Db = num(row, 'Dbmin', className);
451
+ const a = num(row, 'a', className);
452
+ return (Db / 2) / Math.asin(a * DEG);
453
+ }
454
+ function rollerAxisAngleForTapered(row, className) {
455
+ const Db = num(row, 'Dbmin', className);
456
+ const a = num(row, 'a', className);
457
+ const d1 = num(row, 'd1', className);
458
+ const coneLength = (Db / 2) / Math.asin(a * DEG);
459
+ const coneAngle = Math.asin((d1 / 2) / coneLength) / DEG;
460
+ return (a + coneAngle) / 2;
461
+ }
462
+ //# sourceMappingURL=bearing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearing.js","sourceRoot":"","sources":["../src/bearing.ts"],"names":[],"mappings":"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"}
@@ -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"}