@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,81 @@
1
+ /**
2
+ * bearing.ts — 轴承 5 类(W6)—— 上游 `cq_warehouse.bearing.Bearing` 基类 +
3
+ * 5 个子类的逐位复刻。
4
+ *
5
+ * 装配流(`bearing.py:223 make_bearing`):
6
+ * ```
7
+ * outer_race = revolve(outer_race_section) # XZ 平面轮廓绕 Z 旋 360°
8
+ * inner_race = revolve(inner_race_section)
9
+ * bearing = outer.fuse(inner)
10
+ * if capped: bearing = bearing.fuse(cap).fuse(cap.mirror("XY").translate((0,0,B)))
11
+ * else: for each roller in polarArray(race_center_radius, N):
12
+ * bearing = bearing.fuse(roller.located(Location((0,0,B/2))))
13
+ * if cage: bearing = bearing.fuse(cage)
14
+ * ```
15
+ * 滚子(roller):深沟球/角接触 = 球;圆柱滚子 = 圆柱;圆锥滚子 = 圆锥(绕 X 倾
16
+ * `roller_axis_angle`)。
17
+ *
18
+ * 几何坐标:轮廓画在 XZ 平面(局部 x → 世界 X=半径、局部 y → 世界 +Z),
19
+ * `revolveProfile` 绕 Z 轴 360°。滚子阵列在 XY 平面内半径 `race_center_radius`
20
+ * 处,整体抬升到 `z = B/2`(与上游 `polarArray` + `Location((0,0,B/2))` 完全同构)。
21
+ *
22
+ * ⚠️ **两条本阶段首次确认、并由 `scripts/kernel-bearing-probe.py` 实测锁定的复刻事实**:
23
+ * 1. `Sketch.trapezoid(w,h,a1,a2,angle)`(`sketch.py:284`)经 `.push((cx,cy))` 平移 +
24
+ * `.faces()[0].rotate(Y, −90)` 映射成 (半径=|Y|, z=X) 的凸四边形,其中 `angle`
25
+ * 是绕 Z 的**整体旋转**(不是 a2)。`cup` 用 `angle=90°`、`cone` 用 `angle=−90°`,
26
+ * 两者 a2 恒为 90°,故 v4 的 `h/tan(a2)` 项恒为 0。四角 line-line 圆角(r34/r12)
27
+ * 用本文件的 `lineLineFillet` 精确解,与上游 `vertices().fillet()` 在凸四边形上等价。
28
+ * 2. **圆锥滚子的 `roller_diameter` 是几何测量值**:上游 `roller.faces(">Z").edges()
29
+ * .val().radius()*2.5`,即锥顶(z=B/2 处)那一圈半径 ×2.5;本包直接算
30
+ * `2.5·cone_radii[0]`(cone_radii[0] 是 `makeCone` 顶端半径),无需真建锥再量。
31
+ * 3. **上游 `cone_length` 的著名 quirk**:`(Db/2)/asin(radians(a))`(用了 `asin`
32
+ * 而非 `sin`),`cone_angle` 与 `race_center_radius` 都依赖于此——必须逐字复刻,
33
+ * 否则圆锥几何整体偏移。已写入本文件并在探针中数字比对一致。
34
+ */
35
+ import type { BrepHandle } from '@faicad/faijs';
36
+ import { type BearingClassName } from './params.js';
37
+ /**
38
+ * 圆锥轴承内圈(cone)截面的角点(radius=x, height=y)由 `buildBearing` 的 tapered
39
+ * 分支内联构造——因为 cx = T − B/2 依赖 T,闭式由 `scripts/kernel-bearing-probe.py`
40
+ * 对照 cadquery 实测锁定(CONE match=True):
41
+ * V1=(|cy+w/2|, cx−B/2), V2=(|cy−w/2|, cx−B/2),
42
+ * V4=(|cy−w/2|, cx+B/2), V3=(|cy+w/2−B·tan(90+coneAngle), cx+B/2),
43
+ * cy = d/2 + (da−d)/2, cx = T − B/2。
44
+ */
45
+ /**
46
+ * 球滚子(半圆盘 revolve → 实体球)。
47
+ * @param radius - 球半径。
48
+ * @returns 球体 BREP 句柄。
49
+ */
50
+ export declare function sphere(radius: number): BrepHandle;
51
+ /** 轴承构造入参(args 逐字取自 manifest)。 */
52
+ export interface BearingParams {
53
+ size: string;
54
+ bearingType: string;
55
+ }
56
+ /** 轴承构造结果(含上游派生量,供测试锁定)。 */
57
+ export interface BearingResult {
58
+ handle: BrepHandle;
59
+ /** 内径 d。 */
60
+ boreDiameter: number;
61
+ /** 外径 D。 */
62
+ outerDiameter: number;
63
+ /** 宽度(tapered = T,其余 = B)。 */
64
+ thickness: number;
65
+ /** 滚子直径。 */
66
+ rollerDiameter: number;
67
+ /** 滚道中心半径。 */
68
+ raceCenterRadius: number;
69
+ /** 滚子数量。 */
70
+ rollerCount: number;
71
+ }
72
+ /** 5 类轴承的 W6 验收清单(方案 §8-W6)。 */
73
+ export declare const BEARING_CLASSES: readonly BearingClassName[];
74
+ /**
75
+ * 构造一个轴承(5 类统一入口)。
76
+ * @param className - 轴承类名。
77
+ * @param p - 构造入参(size / bearing_type)。
78
+ * @returns 轴承实体与上游派生量。
79
+ */
80
+ export declare function buildBearing(className: BearingClassName, p: BearingParams): BearingResult;
81
+ //# sourceMappingURL=bearing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bearing.d.ts","sourceRoot":"","sources":["../src/bearing.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAA;AAgBzD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,UAAU,CAAA;AA0PjB;;;;;;;GAOG;AAEH;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAMjD;AAiCD,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,4BAA4B;AAC5B,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAA;IAClB,YAAY;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY;IACZ,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,gCAAgC;AAChC,eAAO,MAAM,eAAe,EAAE,SAAS,gBAAgB,EAMtD,CAAA;AAWD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa,CAuJzF"}
@@ -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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"}