@faicad/fai-cq-gears 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 (57) hide show
  1. package/dist/bevel_gear.d.ts +113 -0
  2. package/dist/bevel_gear.d.ts.map +1 -0
  3. package/dist/bevel_gear.js +327 -0
  4. package/dist/bevel_gear.js.map +1 -0
  5. package/dist/crossed_helical_gear.d.ts +24 -0
  6. package/dist/crossed_helical_gear.d.ts.map +1 -0
  7. package/dist/crossed_helical_gear.js +24 -0
  8. package/dist/crossed_helical_gear.js.map +1 -0
  9. package/dist/crossed_pair.d.ts +177 -0
  10. package/dist/crossed_pair.d.ts.map +1 -0
  11. package/dist/crossed_pair.js +237 -0
  12. package/dist/crossed_pair.js.map +1 -0
  13. package/dist/features.d.ts +184 -0
  14. package/dist/features.d.ts.map +1 -0
  15. package/dist/features.js +408 -0
  16. package/dist/features.js.map +1 -0
  17. package/dist/index.d.ts +178 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +223 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/math.d.ts +200 -0
  22. package/dist/math.d.ts.map +1 -0
  23. package/dist/math.js +274 -0
  24. package/dist/math.js.map +1 -0
  25. package/dist/pairs.d.ts +161 -0
  26. package/dist/pairs.d.ts.map +1 -0
  27. package/dist/pairs.js +183 -0
  28. package/dist/pairs.js.map +1 -0
  29. package/dist/planetary.d.ts +96 -0
  30. package/dist/planetary.d.ts.map +1 -0
  31. package/dist/planetary.js +139 -0
  32. package/dist/planetary.js.map +1 -0
  33. package/dist/profile.d.ts +439 -0
  34. package/dist/profile.d.ts.map +1 -0
  35. package/dist/profile.js +592 -0
  36. package/dist/profile.js.map +1 -0
  37. package/dist/rack_gear.d.ts +125 -0
  38. package/dist/rack_gear.d.ts.map +1 -0
  39. package/dist/rack_gear.js +344 -0
  40. package/dist/rack_gear.js.map +1 -0
  41. package/dist/ring_gear.d.ts +54 -0
  42. package/dist/ring_gear.d.ts.map +1 -0
  43. package/dist/ring_gear.js +133 -0
  44. package/dist/ring_gear.js.map +1 -0
  45. package/dist/spline-face.d.ts +99 -0
  46. package/dist/spline-face.d.ts.map +1 -0
  47. package/dist/spline-face.js +94 -0
  48. package/dist/spline-face.js.map +1 -0
  49. package/dist/spur_gear.d.ts +112 -0
  50. package/dist/spur_gear.d.ts.map +1 -0
  51. package/dist/spur_gear.js +206 -0
  52. package/dist/spur_gear.js.map +1 -0
  53. package/dist/worm_gear.d.ts +78 -0
  54. package/dist/worm_gear.d.ts.map +1 -0
  55. package/dist/worm_gear.js +256 -0
  56. package/dist/worm_gear.js.map +1 -0
  57. package/package.json +47 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,592 @@
1
+ /**
2
+ * profile — SpurGear 齿廓与齿面点阵(cq_gears `spur_gear.py` 的数学部分)
3
+ *
4
+ * 只做**纯数学**,不碰内核:输出的是点集,可直接与 Python 侧
5
+ * `SpurGear.t_lflank_pts` 等内部数组逐点比对(见 `profile.test.ts`)。
6
+ *
7
+ * 参数名**逐字沿用 Python**(`module` / `teeth_number` / `pressure_angle` …),
8
+ * 这样 `regression_test_cases.json` 可以零转换直接喂进来。
9
+ */
10
+ import { angleBetween, circle3dBy3points, dot, linspace, norm, rotateRows, sArc, sInv, sphereToCartesian, vec3, } from './math.js';
11
+ /** `GearBase` 的类级常量(cq_gears `spur_gear.py:27-39`),逐字保留。 */
12
+ export const GEAR_BASE_CONSTANTS = {
13
+ ka: 1.0,
14
+ kd: 1.25,
15
+ curve_points: 20,
16
+ surface_splines: 5,
17
+ wire_comb_tol: 1e-2,
18
+ spline_approx_tol: 1e-2,
19
+ shell_sewing_tol: 1e-2,
20
+ isection_tol: 1e-7,
21
+ spline_approx_min_deg: 3,
22
+ spline_approx_max_deg: 8,
23
+ };
24
+ /**
25
+ * 计算 SpurGear 的全部几何量(`SpurGear.__init__` 的移植)。
26
+ *
27
+ * @throws 与 Python 同款校验:`addendum_coeff <= 0` / `dedendum_coeff <= 0` /
28
+ * 齿根圆直径 <= 0。
29
+ *
30
+ * @param params 齿轮参数(模数/齿数/宽度等)
31
+ * @returns 全部派生几何量
32
+ */
33
+ export function spurGearGeometry(params) {
34
+ const ka = params.addendum_coeff ?? GEAR_BASE_CONSTANTS.ka;
35
+ const kd = params.dedendum_coeff ?? GEAR_BASE_CONSTANTS.kd;
36
+ if (params.addendum_coeff !== undefined && params.addendum_coeff !== null && params.addendum_coeff <= 0) {
37
+ throw new RangeError('Addendum coefficient (addendum_coeff) must be greater than 0.');
38
+ }
39
+ if (params.dedendum_coeff !== undefined && params.dedendum_coeff !== null && params.dedendum_coeff <= 0) {
40
+ throw new RangeError('Dedendum coefficient (dedendum_coeff) must be greater than 0.');
41
+ }
42
+ const m = params.module;
43
+ const z = params.teeth_number;
44
+ const a0 = (params.pressure_angle ?? 20.0) * Math.PI / 180;
45
+ const clearance = params.clearance ?? 0.0;
46
+ const backlash = params.backlash ?? 0.0;
47
+ const helixAngle = (params.helix_angle ?? 0.0) * Math.PI / 180;
48
+ const width = params.width;
49
+ const d0 = m * z;
50
+ const adn = ka / (z / d0);
51
+ const ddn = kd / (z / d0);
52
+ if (2 * ddn + 2 * clearance >= d0) {
53
+ throw new RangeError('Invalid dedendum or clearance: resulting dedendum circle diameter is negative or zero.');
54
+ }
55
+ const da = d0 + 2 * adn;
56
+ const dd = d0 - 2 * ddn - 2 * clearance;
57
+ const s0 = m * (Math.PI / 2 - backlash * Math.tan(a0));
58
+ const invA0 = Math.tan(a0) - a0;
59
+ const r0 = d0 / 2;
60
+ const ra = da / 2;
61
+ const rd = dd / 2;
62
+ const rb = Math.cos(a0) * d0 / 2;
63
+ const rr = Math.max(rb, rd);
64
+ const tau = Math.PI * 2 / z;
65
+ const twistAngle = helixAngle !== 0
66
+ ? width / (r0 * Math.tan(Math.PI / 2 - helixAngle))
67
+ : 0.0;
68
+ const surfaceSplines = helixAngle !== 0 ? GEAR_BASE_CONSTANTS.surface_splines : 2;
69
+ const n = GEAR_BASE_CONSTANTS.curve_points;
70
+ // 左齿廓渐开线
71
+ const r = linspace(rr, ra, n);
72
+ const phi = r.map((ri) => {
73
+ const cosA = (r0 / ri) * Math.cos(a0);
74
+ const a = Math.acos(Math.min(1, Math.max(-1, cosA)));
75
+ const invA = Math.tan(a) - a;
76
+ const s = ri * (s0 / d0 + invA0 - invA);
77
+ return s / ri;
78
+ });
79
+ const t_lflank_pts = r.map((ri, i) => vec3(Math.cos(phi[i]) * ri, Math.sin(phi[i]) * ri, 0));
80
+ // 齿顶圆弧
81
+ const bTip = linspace(phi[n - 1], -phi[n - 1], n);
82
+ const t_tip_pts = bTip.map((bi) => vec3(Math.cos(bi) * ra, Math.sin(bi) * ra, 0));
83
+ // 右齿廓 = 左齿廓镜像并反向
84
+ const t_rflank_pts = r.map((ri, i) => vec3(Math.cos(-phi[i]) * ri, Math.sin(-phi[i]) * ri, 0)).reverse();
85
+ // 齿根圆弧:过右齿廓末点、齿根圆中点、左齿廓起点(下一个齿的起点)三点定圆
86
+ const rho = tau - phi[0] * 2;
87
+ const p1 = vec3(t_rflank_pts[n - 1].x, t_rflank_pts[n - 1].y, 0);
88
+ const p2 = vec3(Math.cos(-phi[0] - rho / 2) * rd, Math.sin(-phi[0] - rho / 2) * rd, 0);
89
+ const p3 = vec3(Math.cos(-phi[0] - rho) * rr, Math.sin(-phi[0] - rho) * rr, 0);
90
+ const { radius: bcr, center: bcxy } = circle3dBy3points(p1, p2, p3);
91
+ let t1 = Math.atan2(p1.y - bcxy.y, p1.x - bcxy.x);
92
+ let t2 = Math.atan2(p3.y - bcxy.y, p3.x - bcxy.x);
93
+ if (t1 < 0)
94
+ t1 += Math.PI * 2;
95
+ if (t2 < 0)
96
+ t2 += Math.PI * 2;
97
+ const ta = Math.min(t1, t2);
98
+ const tb = Math.max(t1, t2);
99
+ const tRoot = linspace(ta + Math.PI * 2, tb + Math.PI * 2, n);
100
+ const t_root_pts = tRoot.map((t) => vec3(bcxy.x + bcr * Math.cos(t), bcxy.y + bcr * Math.sin(t), 0));
101
+ return {
102
+ m, z, a0, clearance, backlash, helixAngle, width, ka, kd,
103
+ d0, adn, ddn, da, dd, s0, invA0,
104
+ r0, ra, rd, rb, rr, tau,
105
+ twistAngle, surfaceSplines, curvePoints: n,
106
+ t_lflank_pts, t_tip_pts, t_rflank_pts, t_root_pts,
107
+ };
108
+ }
109
+ /**
110
+ * 计算 HyperbolicGear(双曲面齿轮)的全部几何量
111
+ * (`crossed_helical_gear.py::HyperbolicGear.__init__` 的移植)。
112
+ *
113
+ * 它继承 `SpurGear`,**齿廓数学与 SpurGear 同构**——父类以 `helix_angle=0.0` 构造
114
+ * (故 `twistAngle=0` / `surfaceSplines=2`),然后本函数**覆盖**两处:
115
+ * - `self.twist_angle = radians(twist_angle)`:扭转角来自显式构造参数,而非 helix 推导;
116
+ * - `throat_r`(`throat_r = sqrt(rpx² + rpy²)`,`rpx=(r0+ln)/2`、`rpy=ht/2`、
117
+ * `ln=cos(twist)·r0`、`ht=sin(twist)·r0`):喉部半径,用于齿轮对装配的 X 向偏移。
118
+ *
119
+ * 返回的仍是 `SpurGearGeometry`(点集布局一致),可直接喂给 `buildGearSolid` /
120
+ * `toothFaceGrids`;`throatR` 作为扩展字段附带。
121
+ *
122
+ * @throws `twist_angle` 缺失(无默认值,与 Python 同款签名)由调用方负责。
123
+ *
124
+ * @param params 双曲面齿轮参数(模数/齿数/宽度/扭转角等)
125
+ * @returns `SpurGearGeometry` + `throatR`
126
+ */
127
+ export function hyperbolicGearGeometry(params) {
128
+ const base = spurGearGeometry({
129
+ module: params.module,
130
+ teeth_number: params.teeth_number,
131
+ width: params.width,
132
+ pressure_angle: params.pressure_angle,
133
+ clearance: params.clearance,
134
+ backlash: params.backlash,
135
+ helix_angle: 0.0,
136
+ });
137
+ const twistAngle = (params.twist_angle * Math.PI) / 180.0;
138
+ base.twistAngle = twistAngle;
139
+ base.surfaceSplines = 2;
140
+ const ln = Math.cos(twistAngle) * base.r0;
141
+ const ht = Math.sin(twistAngle) * base.r0;
142
+ const rpx = (base.r0 + ln) / 2.0;
143
+ const rpy = ht / 2.0;
144
+ const throatR = Math.sqrt(rpx * rpx + rpy * rpy);
145
+ return { ...base, throatR };
146
+ }
147
+ /**
148
+ * 计算 RingGear(内部齿)的全部几何量(`RingGear.__init__` 的移植)。
149
+ *
150
+ * 与 SpurGear 的关键差异(内部齿):
151
+ * - 齿顶圆 `da = d0 − 2·adn`(比分度圆小)、齿根圆 `dd = d0 + 2·ddn + 2·clearance`(比分度圆大);
152
+ * - 齿厚 `s0 = m·(π/2 + backlash·tan(a0))`(注意是 **+**,外齿是 −);
153
+ * - 渐开线 `r = linspace(ra, rr)`:从齿顶圆(内)走向齿根圆(外),与外齿方向相反;
154
+ * - 齿顶圆弧落在 `rd`(外齿是 `ra`)、齿根圆弧落在 `ra`(外齿是 `rd`)——齿尖朝外、齿根朝内。
155
+ *
156
+ * `ka` / `kd` 固定取 `GEAR_BASE_CONSTANTS`(内部齿在 `e73874c` 不支持 `addendum_coeff`)。
157
+ * 返回的仍是 `SpurGearGeometry`(点集布局一致),可直接喂给 `toothFaceGrids` /
158
+ * `buildToothFaces`,无需为 RingGear 另写齿面构造。
159
+ *
160
+ * @throws 与 Python 同款校验:齿根圆直径 <= 0。
161
+ *
162
+ * @param params 内部齿参数(模数/齿数/宽度/轮缘宽等)
163
+ * @returns 全部派生几何量(与 `SpurGearGeometry` 同构)
164
+ */
165
+ export function ringGearGeometry(params) {
166
+ const ka = GEAR_BASE_CONSTANTS.ka;
167
+ const kd = GEAR_BASE_CONSTANTS.kd;
168
+ // 防御性守卫:RingGear 不接受 addendum_coeff,但 JS 调用方可能多传字段——显式拒绝而不是静默忽略。
169
+ if (params.addendum_coeff !== undefined) {
170
+ throw new Error('RingGear does not support addendum_coeff at this source revision (e73874c).');
171
+ }
172
+ const m = params.module;
173
+ const z = params.teeth_number;
174
+ const a0 = (params.pressure_angle ?? 20.0) * Math.PI / 180;
175
+ const clearance = params.clearance ?? 0.0;
176
+ const backlash = params.backlash ?? 0.0;
177
+ const helixAngle = (params.helix_angle ?? 0.0) * Math.PI / 180;
178
+ const width = params.width;
179
+ // 注意:`rim_width` 只用于实体构造阶段的 rim 半径(`ring_gear.ts`),
180
+ // 齿廓几何量本身与它无关,故此函数不读该字段。
181
+ const d0 = m * z;
182
+ const adn = ka / (z / d0);
183
+ const ddn = kd / (z / d0);
184
+ if (2 * ddn + 2 * clearance >= d0) {
185
+ throw new RangeError('Invalid dedendum or clearance: resulting dedendum circle diameter is negative or zero.');
186
+ }
187
+ const da = d0 - 2 * adn;
188
+ const dd = d0 + 2 * ddn + 2 * clearance;
189
+ const s0 = m * (Math.PI / 2 + backlash * Math.tan(a0)); // 内部齿:+
190
+ const invA0 = Math.tan(a0) - a0;
191
+ const r0 = d0 / 2;
192
+ const ra = da / 2;
193
+ const rd = dd / 2;
194
+ const rb = Math.cos(a0) * d0 / 2;
195
+ const rr = Math.max(rb, rd);
196
+ const tau = Math.PI * 2 / z;
197
+ const twistAngle = helixAngle !== 0
198
+ ? width / (r0 * Math.tan(Math.PI / 2 - helixAngle))
199
+ : 0.0;
200
+ const surfaceSplines = helixAngle !== 0 ? GEAR_BASE_CONSTANTS.surface_splines : 2;
201
+ const n = GEAR_BASE_CONSTANTS.curve_points;
202
+ // 左齿廓渐开线:r 从齿顶圆 ra(内)到 rr(外)
203
+ const r = linspace(ra, rr, n);
204
+ const phi = r.map((ri) => {
205
+ const cosA = (r0 / ri) * Math.cos(a0);
206
+ const a = Math.acos(Math.min(1, Math.max(-1, cosA)));
207
+ const invA = Math.tan(a) - a;
208
+ const s = ri * (s0 / d0 + invA0 - invA);
209
+ return s / ri;
210
+ });
211
+ const t_lflank_pts = r.map((ri, i) => vec3(Math.cos(phi[i]) * ri, Math.sin(phi[i]) * ri, 0));
212
+ // 齿顶圆弧:落在 rd(外齿落在 ra)
213
+ const bTip = linspace(phi[n - 1], -phi[n - 1], n);
214
+ const t_tip_pts = bTip.map((bi) => vec3(Math.cos(bi) * rd, Math.sin(bi) * rd, 0));
215
+ // 右齿廓 = 左齿廓镜像并反向
216
+ const t_rflank_pts = r.map((ri, i) => vec3(Math.cos(-phi[i]) * ri, Math.sin(-phi[i]) * ri, 0)).reverse();
217
+ // 齿根圆弧:过右齿廓末点、齿根圆(ra)中点、左齿廓起点三点定圆
218
+ const rho = tau - phi[0] * 2;
219
+ const p1 = vec3(t_rflank_pts[n - 1].x, t_rflank_pts[n - 1].y, 0);
220
+ const p2 = vec3(Math.cos(-phi[0] - rho / 2) * ra, Math.sin(-phi[0] - rho / 2) * ra, 0);
221
+ const p3 = vec3(Math.cos(-phi[0] - rho) * ra, Math.sin(-phi[0] - rho) * ra, 0);
222
+ const { radius: bcr, center: bcxy } = circle3dBy3points(p1, p2, p3);
223
+ let t1 = Math.atan2(p1.y - bcxy.y, p1.x - bcxy.x);
224
+ let t2 = Math.atan2(p3.y - bcxy.y, p3.x - bcxy.x);
225
+ if (t1 < 0)
226
+ t1 += Math.PI * 2;
227
+ if (t2 < 0)
228
+ t2 += Math.PI * 2;
229
+ const ta = Math.min(t1, t2);
230
+ const tb = Math.max(t1, t2);
231
+ // 注意:内部齿 `ring_gear.py` 用 **递减** 采样 `linspace(t2 + 2π, t1 + 2π)`(与外齿
232
+ // `spur_gear.py` 的递增相反)。必须保持同向,否则大齿数非对称齿根弧整段错开(实测 ~2.6mm)。
233
+ const tRoot = linspace(tb + Math.PI * 2, ta + Math.PI * 2, n);
234
+ const t_root_pts = tRoot.map((t) => vec3(bcxy.x + bcr * Math.cos(t), bcxy.y + bcr * Math.sin(t), 0));
235
+ return {
236
+ m, z, a0, clearance, backlash, helixAngle, width, ka, kd,
237
+ d0, adn, ddn, da, dd, s0, invA0,
238
+ r0, ra, rd, rb, rr, tau,
239
+ twistAngle, surfaceSplines, curvePoints: n,
240
+ t_lflank_pts, t_tip_pts, t_rflank_pts, t_root_pts,
241
+ };
242
+ }
243
+ /**
244
+ * 计算 CrossedHelicalGear(交错轴斜齿轮)的全部几何量
245
+ * (`crossed_helical_gear.py::CrossedHelicalGear.__init__` 的移植)。
246
+ *
247
+ * 与 SpurGear 的**根本差异**是「端面模数」而非「法向模数」:
248
+ * - 端面压力角 `at0 = arctan(a0 / cos(helix))`——⚠️ 源码里 `a0` 是**弧度值**直接除以
249
+ * `cos(helix)`(并非 `tan(a0)`),这是 cq_gears 的原始写法,必须逐字复刻,
250
+ * 否则 `rb` 会偏(实测 case30 rb 由 20.2898 偏到 20.1227);
251
+ * - 端面模数 `mt = m / cos(helix)`,分度圆直径 `d0 = mt·z`(SpurGear 是 `m·z`);
252
+ * - 分度圆齿厚 `s0 = r0·π/z`(SpurGear 是 `m·(π/2 − backlash·tan(a0))`);
253
+ * - 基圆半径 `rb = cos(at0)·r0`。
254
+ *
255
+ * 其余(渐开线采样、齿顶/齿根圆弧、扭转角、齿面行数)与 SpurGear 同构,返回的仍是
256
+ * `SpurGearGeometry`,可直接喂给 `toothFaceGrids` / `buildToothFaces`。
257
+ *
258
+ * 源码此处**没有**齿根圆直径校验(与 SpurGear 不同),故不复刻该抛错。
259
+ *
260
+ * @param params 交错轴斜齿轮参数(模数/齿数/宽度/螺旋角等)
261
+ * @returns 全部派生几何量(与 `SpurGearGeometry` 同构)
262
+ */
263
+ export function crossedHelicalGearGeometry(params) {
264
+ const ka = GEAR_BASE_CONSTANTS.ka;
265
+ const kd = GEAR_BASE_CONSTANTS.kd;
266
+ const m = params.module;
267
+ const z = params.teeth_number;
268
+ const a0 = (params.pressure_angle ?? 20.0) * Math.PI / 180;
269
+ const clearance = params.clearance ?? 0.0;
270
+ const backlash = params.backlash ?? 0.0;
271
+ const helixAngle = (params.helix_angle ?? 0.0) * Math.PI / 180;
272
+ const width = params.width;
273
+ // ⚠️ 源码写法:a0(弧度)直接除以 cos(helix),不是 tan(a0)。
274
+ const at0 = Math.atan(a0 / Math.cos(helixAngle));
275
+ const mt = m / Math.cos(helixAngle);
276
+ const d0 = mt * z;
277
+ const adn = ka / (z / d0);
278
+ const ddn = kd / (z / d0);
279
+ const da = d0 + 2 * adn;
280
+ const dd = d0 - 2 * ddn - 2 * clearance;
281
+ const invA0 = Math.tan(at0) - at0;
282
+ const r0 = d0 / 2;
283
+ const ra = da / 2;
284
+ const rd = dd / 2;
285
+ const rb = Math.cos(at0) * r0;
286
+ const rr = Math.max(rb, rd);
287
+ const tau = Math.PI * 2 / z;
288
+ const s0 = r0 * Math.PI / z;
289
+ const twistAngle = helixAngle !== 0
290
+ ? width / (r0 * Math.tan(Math.PI / 2 - helixAngle))
291
+ : 0.0;
292
+ const surfaceSplines = helixAngle !== 0 ? GEAR_BASE_CONSTANTS.surface_splines : 2;
293
+ const n = GEAR_BASE_CONSTANTS.curve_points;
294
+ // 左齿廓渐开线(用端面压力角 at0)
295
+ const r = linspace(rr, ra, n);
296
+ const phi = r.map((ri) => {
297
+ const cosA = (r0 / ri) * Math.cos(at0);
298
+ const a = Math.acos(Math.min(1, Math.max(-1, cosA)));
299
+ const invA = Math.tan(a) - a;
300
+ const s = ri * (s0 / d0 + invA0 - invA);
301
+ return s / ri;
302
+ });
303
+ const t_lflank_pts = r.map((ri, i) => vec3(Math.cos(phi[i]) * ri, Math.sin(phi[i]) * ri, 0));
304
+ // 齿顶圆弧
305
+ const bTip = linspace(phi[n - 1], -phi[n - 1], n);
306
+ const t_tip_pts = bTip.map((bi) => vec3(Math.cos(bi) * ra, Math.sin(bi) * ra, 0));
307
+ // 右齿廓 = 左齿廓镜像并反向
308
+ const t_rflank_pts = r.map((ri, i) => vec3(Math.cos(-phi[i]) * ri, Math.sin(-phi[i]) * ri, 0)).reverse();
309
+ // 齿根圆弧(与外齿一致:p2 在 rd、p3 在 rr,递增采样)
310
+ const rho = tau - phi[0] * 2;
311
+ const p1 = vec3(t_rflank_pts[n - 1].x, t_rflank_pts[n - 1].y, 0);
312
+ const p2 = vec3(Math.cos(-phi[0] - rho / 2) * rd, Math.sin(-phi[0] - rho / 2) * rd, 0);
313
+ const p3 = vec3(Math.cos(-phi[0] - rho) * rr, Math.sin(-phi[0] - rho) * rr, 0);
314
+ const { radius: bcr, center: bcxy } = circle3dBy3points(p1, p2, p3);
315
+ let t1 = Math.atan2(p1.y - bcxy.y, p1.x - bcxy.x);
316
+ let t2 = Math.atan2(p3.y - bcxy.y, p3.x - bcxy.x);
317
+ if (t1 < 0)
318
+ t1 += Math.PI * 2;
319
+ if (t2 < 0)
320
+ t2 += Math.PI * 2;
321
+ const ta = Math.min(t1, t2);
322
+ const tb = Math.max(t1, t2);
323
+ const tRoot = linspace(ta + Math.PI * 2, tb + Math.PI * 2, n);
324
+ const t_root_pts = tRoot.map((t) => vec3(bcxy.x + bcr * Math.cos(t), bcxy.y + bcr * Math.sin(t), 0));
325
+ return {
326
+ m, z, a0, clearance, backlash, helixAngle, width, ka, kd,
327
+ d0, adn, ddn, da, dd, s0, invA0,
328
+ r0, ra, rd, rb, rr, tau,
329
+ twistAngle, surfaceSplines, curvePoints: n,
330
+ t_lflank_pts, t_tip_pts, t_rflank_pts, t_root_pts,
331
+ };
332
+ }
333
+ /** `BevelGear` 覆写 `GearBase` 的类常量(`bevel_gear.py:32`;`helix_angle = 0` 时被改成 2)。 */
334
+ export const BEVEL_SURFACE_SPLINES = 12;
335
+ /**
336
+ * 计算 BevelGear(锥齿轮)的全部几何量(`BevelGear.__init__` 的移植)。
337
+ *
338
+ * 与 SpurGear 的根本差异:齿廓画在**单位球面**上(球面渐开线),
339
+ * 齿面是「球面齿廓 × 锥距」的直纹面;`gamma_b/_f/_r` 分别是基/面/根锥角,
340
+ * 高度一律用 `r·cos(gamma)` 折算到齿轮轴(+Z)上。
341
+ *
342
+ * @throws `gs_r <= face_width` 时抛 RangeError(Python 同款 assert);
343
+ * `twist_angle` 为 NaN 时抛 Error(Python 同款 assert)。
344
+ *
345
+ * @param params 锥齿轮参数(模数/齿数/锥角/齿宽等)
346
+ * @returns 全部派生几何量
347
+ */
348
+ export function bevelGearGeometry(params) {
349
+ const ka = GEAR_BASE_CONSTANTS.ka;
350
+ const kd = GEAR_BASE_CONSTANTS.kd;
351
+ const m = params.module;
352
+ const z = params.teeth_number;
353
+ const a0 = ((params.pressure_angle ?? 20.0) * Math.PI) / 180.0;
354
+ const clearance = params.clearance ?? 0.0;
355
+ const backlash = params.backlash ?? 0.0;
356
+ const helixAngle = ((params.helix_angle ?? 0.0) * Math.PI) / 180.0;
357
+ const faceWidth = params.face_width;
358
+ const gammaP = (params.cone_angle * Math.PI) / 180.0;
359
+ const rp = (m * z) / 2.0;
360
+ const gsR = rp / Math.sin(gammaP);
361
+ if (!(gsR > faceWidth)) {
362
+ throw new RangeError(`face_width value is too big, it should be < ${gsR.toFixed(3)}`);
363
+ }
364
+ const gammaB = Math.asin(Math.cos(a0) * Math.sin(gammaP));
365
+ const gammaF = gammaP + Math.atan((ka * m) / gsR);
366
+ const gammaR = gammaP - Math.atan((kd * m) / gsR);
367
+ const tau = (Math.PI * 2.0) / z;
368
+ let twistAngle;
369
+ let surfaceSplines;
370
+ if (helixAngle !== 0.0) {
371
+ // 扭转(torsion)角
372
+ const beta = Math.atan((faceWidth * Math.tan(helixAngle)) / (2.0 * gsR - faceWidth));
373
+ twistAngle = Math.asin((gsR / rp) * Math.sin(beta)) * 2.0;
374
+ surfaceSplines = BEVEL_SURFACE_SPLINES;
375
+ }
376
+ else {
377
+ surfaceSplines = 2;
378
+ twistAngle = 0.0;
379
+ }
380
+ if (Number.isNaN(twistAngle)) {
381
+ throw new Error('Twist angle is NaN');
382
+ }
383
+ const coneH = Math.cos(gammaR) * gsR;
384
+ const phiR = sInv(gammaB, gammaP);
385
+ const mpTheta = Math.PI / z + 2.0 * phiR;
386
+ const n = GEAR_BASE_CONSTANTS.curve_points;
387
+ // 左齿廓:球面渐开线
388
+ const gammaTr = Math.max(gammaB, gammaR);
389
+ const gamma = linspace(gammaTr, gammaF, n);
390
+ const theta = gamma.map((g) => sInv(gammaB, g) + backlash / (m * z));
391
+ const t_lflank_pts = gamma.map((g, i) => sphereToCartesian(1.0, g, theta[i]));
392
+ // 齿顶圆弧(恒在 gamma_f)
393
+ const thetaTip = linspace(theta[n - 1], mpTheta - theta[n - 1], n);
394
+ const t_tip_pts = thetaTip.map((t) => sphereToCartesian(1.0, gammaF, t));
395
+ // 右齿廓 = 左齿廓的镜像(方位角取 mp_theta − theta)并反向
396
+ const t_rflank_pts = [];
397
+ for (let i = n - 1; i >= 0; i--) {
398
+ t_rflank_pts.push(sphereToCartesian(1.0, gamma[i], mpTheta - theta[i]));
399
+ }
400
+ // 齿根圆弧
401
+ let t_root_pts;
402
+ if (gammaR < gammaB) {
403
+ // 根锥在基锥之内:过右齿廓末点、基锥上的齿槽中点、根锥上的齿槽中点三点定圆
404
+ const p1 = t_rflank_pts[n - 1];
405
+ const p2 = sphereToCartesian(1.0, gammaB, theta[0] + tau);
406
+ const p3 = sphereToCartesian(1.0, gammaR, (tau + mpTheta) / 2.0);
407
+ const { center: rcc } = circle3dBy3points(p1, p2, p3);
408
+ const rccGamma = Math.acos(dot(p3, rcc) / (norm(p3) * norm(rcc)));
409
+ const p1p3 = angleBetween(rcc, p1, p3);
410
+ const aStart = (Math.PI - p1p3 * 2.0) / 2.0;
411
+ const aEnd = -aStart + Math.PI;
412
+ t_root_pts = sArc(1.0, gammaR + rccGamma, (tau + mpTheta) / 2.0, rccGamma, Math.PI / 2.0 + aStart, Math.PI / 2.0 + aEnd, n);
413
+ }
414
+ else {
415
+ const rTheta = linspace(mpTheta - theta[0], theta[0] + tau, n);
416
+ t_root_pts = rTheta.map((t) => sphereToCartesian(1.0, gammaTr, t));
417
+ }
418
+ return {
419
+ m, z, a0, clearance, backlash, helixAngle, faceWidth, ka, kd,
420
+ rp, gsR, gammaP, gammaB, gammaF, gammaR, tau, coneH, mpTheta,
421
+ twistAngle, surfaceSplines, curvePoints: n,
422
+ t_lflank_pts, t_tip_pts, t_rflank_pts, t_root_pts,
423
+ };
424
+ }
425
+ /** 四段齿廓的名字(`_build_tooth_faces` 的迭代顺序,勿改)。 */
426
+ export const TOOTH_SEGMENTS = ['lflank', 'tip', 'rflank', 'root'];
427
+ /**
428
+ * 取某段齿廓的基础点集(z=0 平面上的轮廓点,与 Python 内部数组逐点一致)。
429
+ *
430
+ * @param g 已计算的齿轮几何量
431
+ * @param seg 齿廓段名
432
+ * @returns 该段的点集
433
+ */
434
+ export function segmentPoints(g, seg) {
435
+ switch (seg) {
436
+ case 'lflank': return g.t_lflank_pts;
437
+ case 'tip': return g.t_tip_pts;
438
+ case 'rflank': return g.t_rflank_pts;
439
+ case 'root': return g.t_root_pts;
440
+ }
441
+ }
442
+ /**
443
+ * 复现 `SpurGear._build_tooth_faces` 的点阵构造。
444
+ *
445
+ * 注意扭转用 `pts @ rotation_matrix(...)`(行向量左乘 ⇒ 实际转 −a,见 `math.ts` 顶部说明),
446
+ * 与 Python 逐字一致。
447
+ *
448
+ * @param twistA 起始扭转角(弧度)
449
+ * @param twistB 终止扭转角(弧度)
450
+ * @param zPos 起始 z
451
+ * @param width 该段宽度
452
+ * @param g 齿轮几何量
453
+ * @returns 4 段齿廓各自的 row×col 点阵
454
+ */
455
+ export function toothFaceGrids(g, twistA = 0.0, twistB = g.twistAngle, zPos = 0.0, width = g.width) {
456
+ const twistSpan = Math.abs(g.twistAngle);
457
+ const surfSplines = Math.max(1, Math.ceil(twistSpan / Math.PI)) * g.surfaceSplines;
458
+ const angles = linspace(twistA, twistB, surfSplines);
459
+ const zs = linspace(zPos, zPos + width, surfSplines);
460
+ return TOOTH_SEGMENTS.map((seg) => {
461
+ const base = segmentPoints(g, seg);
462
+ const points = [];
463
+ for (let r = 0; r < surfSplines; r++) {
464
+ const z = zs[r];
465
+ const row = base.map((p) => vec3(p.x, p.y, z));
466
+ points.push(rotateRows(row, vec3(0, 0, 1), angles[r]));
467
+ }
468
+ return { segment: seg, rows: surfSplines, cols: base.length, points };
469
+ });
470
+ }
471
+ /**
472
+ * 按 cq_gears 类名分派到对应的齿廓几何计算(manifest 的 `class` 字段直接驱动)。
473
+ *
474
+ * `HerringboneGear` 继承 `SpurGear`、`HerringboneRingGear` 继承 `RingGear`,
475
+ * 其**齿廓数学**与父类相同(人字形的差异只体现在建面阶段的 `_build_tooth_faces` 覆盖),
476
+ * 故分派到同一函数。
477
+ *
478
+ * @throws 未支持的类名直接抛错(不静默退回 SpurGear,避免掩盖分派错误)
479
+ *
480
+ * @param className cq_gears 类名(`SpurGear` / `RingGear` / `CrossedHelicalGear` …)
481
+ * @param args 该类构造函数的参数(逐字取自 manifest)
482
+ * @returns 全部派生几何量
483
+ */
484
+ export function gearGeometryForClass(className, args) {
485
+ switch (className) {
486
+ case 'SpurGear':
487
+ case 'HerringboneGear':
488
+ return spurGearGeometry(args);
489
+ case 'HyperbolicGear':
490
+ return hyperbolicGearGeometry(args);
491
+ case 'RingGear':
492
+ case 'HerringboneRingGear':
493
+ return ringGearGeometry(args);
494
+ case 'CrossedHelicalGear':
495
+ return crossedHelicalGearGeometry(args);
496
+ case 'Worm':
497
+ return wormGeometry(args);
498
+ case 'BevelGear':
499
+ return bevelGearGeometry(args);
500
+ default:
501
+ throw new Error(`gearGeometryForClass: unsupported gear class '${className}'`);
502
+ }
503
+ }
504
+ /**
505
+ * 计算 RackGear 的全部几何量(`RackGear.__init__` 的移植)。
506
+ *
507
+ * 齿条齿廓是**梯形直线段**(每段只有 2 个点),沿 X 以 π·m 为周期重复;
508
+ * 齿深方向是 +y(la 在上、ld 在下),实体沿 Z 挤出 width。
509
+ * `ka`/`kd` 沿用 GearBase 类常量(RackGear 构造函数不接受 addendum/dedendum 覆盖)。
510
+ *
511
+ * @param params 齿条参数(模数/长度/宽/高/螺旋角等)
512
+ * @returns 全部派生几何量
513
+ */
514
+ export function rackGearGeometry(params) {
515
+ const ka = GEAR_BASE_CONSTANTS.ka;
516
+ const kd = GEAR_BASE_CONSTANTS.kd;
517
+ const m = params.module;
518
+ const a0 = ((params.pressure_angle ?? 20.0) * Math.PI) / 180.0;
519
+ const clearance = params.clearance ?? 0.0;
520
+ const backlash = params.backlash ?? 0.0;
521
+ const helixAngle = ((params.helix_angle ?? 0.0) * Math.PI) / 180.0;
522
+ const width = params.width;
523
+ const length = params.length;
524
+ const height = params.height;
525
+ const la = ka * m;
526
+ const ld = -(kd * m + clearance);
527
+ const s0 = (m * (Math.PI / 2.0 - backlash * Math.tan(a0))) / 2.0;
528
+ const p1x = Math.tan(a0) * Math.abs(ld);
529
+ const p1p2 = (Math.abs(la) + Math.abs(ld)) / Math.cos(a0);
530
+ const p1 = vec3(-s0 - p1x, ld, 0.0);
531
+ const p2 = vec3(Math.sin(a0) * p1p2 + p1.x, Math.cos(a0) * p1p2 + p1.y, 0.0);
532
+ const p3 = vec3(-p2.x, p2.y, 0.0);
533
+ const p4 = vec3(-p1.x, p1.y, 0.0);
534
+ const p5 = vec3(p4.x + (Math.PI * m - p4.x * 2.0), p4.y, 0.0);
535
+ const toothHeight = Math.abs(la) + Math.abs(ld);
536
+ const z = Math.ceil(length / (Math.PI * m));
537
+ return {
538
+ m, a0, clearance, backlash, helixAngle, width, length, height,
539
+ la, ld, s0, toothHeight, z,
540
+ t_lflank_pts: [p1, p2],
541
+ t_tip_pts: [p2, p3],
542
+ t_rflank_pts: [p3, p4],
543
+ t_root_pts: [p4, p5],
544
+ };
545
+ }
546
+ /**
547
+ * 计算 Worm 的全部几何量(`Worm.__init__` 的移植)。
548
+ *
549
+ * 齿廓公式与 `RackGear.__init__` **逐字同构**(梯形直线段 p1–p5)——cq 里 Worm
550
+ * 的齿廓本来就是「展开到分度圆柱切平面上的齿条」。差异只在分度半径:
551
+ * `d0 = n_threads·m / |tan(lead_angle)|`,以及半径向的 ra/rd。
552
+ *
553
+ * @param params 蜗杆参数(模数/导程角/头数/长度等)
554
+ * @returns 全部派生几何量
555
+ */
556
+ export function wormGeometry(params) {
557
+ const ka = GEAR_BASE_CONSTANTS.ka;
558
+ const kd = GEAR_BASE_CONSTANTS.kd;
559
+ const m = params.module;
560
+ const a0 = ((params.pressure_angle ?? 20.0) * Math.PI) / 180.0;
561
+ const clearance = params.clearance ?? 0.0;
562
+ const backlash = params.backlash ?? 0.0;
563
+ const leadAngle = (params.lead_angle * Math.PI) / 180.0;
564
+ const length = params.length;
565
+ const nThreads = params.n_threads;
566
+ const d0 = (nThreads * m) / Math.abs(Math.tan(leadAngle));
567
+ const r0 = d0 / 2.0;
568
+ const adn = ka * m;
569
+ const ddn = kd * m;
570
+ const la = adn;
571
+ const ld = -(ddn + clearance);
572
+ const ra = r0 + adn;
573
+ const rd = r0 - ddn;
574
+ const s0 = (m * (Math.PI / 2.0 - backlash * Math.tan(a0))) / 2.0;
575
+ const p1x = Math.tan(a0) * Math.abs(ld);
576
+ const p1p2 = (Math.abs(la) + Math.abs(ld)) / Math.cos(a0);
577
+ const p1 = vec3(-s0 - p1x, ld, 0.0);
578
+ const p2 = vec3(Math.sin(a0) * p1p2 + p1.x, Math.cos(a0) * p1p2 + p1.y, 0.0);
579
+ const p3 = vec3(-p2.x, p2.y, 0.0);
580
+ const p4 = vec3(-p1.x, p1.y, 0.0);
581
+ const p5 = vec3(p4.x + (Math.PI * m - p4.x * 2.0), p4.y, 0.0);
582
+ const toothHeight = Math.abs(la) + Math.abs(ld);
583
+ return {
584
+ m, a0, clearance, backlash, leadAngle, length, nThreads,
585
+ r0, ra, rd, la, ld, s0, toothHeight,
586
+ t_lflank_pts: [p1, p2],
587
+ t_tip_pts: [p2, p3],
588
+ t_rflank_pts: [p3, p4],
589
+ t_root_pts: [p4, p5],
590
+ };
591
+ }
592
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}