@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.
- package/dist/bevel_gear.d.ts +113 -0
- package/dist/bevel_gear.d.ts.map +1 -0
- package/dist/bevel_gear.js +327 -0
- package/dist/bevel_gear.js.map +1 -0
- package/dist/crossed_helical_gear.d.ts +24 -0
- package/dist/crossed_helical_gear.d.ts.map +1 -0
- package/dist/crossed_helical_gear.js +24 -0
- package/dist/crossed_helical_gear.js.map +1 -0
- package/dist/crossed_pair.d.ts +177 -0
- package/dist/crossed_pair.d.ts.map +1 -0
- package/dist/crossed_pair.js +237 -0
- package/dist/crossed_pair.js.map +1 -0
- package/dist/features.d.ts +184 -0
- package/dist/features.d.ts.map +1 -0
- package/dist/features.js +408 -0
- package/dist/features.js.map +1 -0
- package/dist/index.d.ts +178 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +200 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +274 -0
- package/dist/math.js.map +1 -0
- package/dist/pairs.d.ts +161 -0
- package/dist/pairs.d.ts.map +1 -0
- package/dist/pairs.js +183 -0
- package/dist/pairs.js.map +1 -0
- package/dist/planetary.d.ts +96 -0
- package/dist/planetary.d.ts.map +1 -0
- package/dist/planetary.js +139 -0
- package/dist/planetary.js.map +1 -0
- package/dist/profile.d.ts +439 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +592 -0
- package/dist/profile.js.map +1 -0
- package/dist/rack_gear.d.ts +125 -0
- package/dist/rack_gear.d.ts.map +1 -0
- package/dist/rack_gear.js +344 -0
- package/dist/rack_gear.js.map +1 -0
- package/dist/ring_gear.d.ts +54 -0
- package/dist/ring_gear.d.ts.map +1 -0
- package/dist/ring_gear.js +133 -0
- package/dist/ring_gear.js.map +1 -0
- package/dist/spline-face.d.ts +99 -0
- package/dist/spline-face.d.ts.map +1 -0
- package/dist/spline-face.js +94 -0
- package/dist/spline-face.js.map +1 -0
- package/dist/spur_gear.d.ts +112 -0
- package/dist/spur_gear.d.ts.map +1 -0
- package/dist/spur_gear.js +206 -0
- package/dist/spur_gear.js.map +1 -0
- package/dist/worm_gear.d.ts +78 -0
- package/dist/worm_gear.d.ts.map +1 -0
- package/dist/worm_gear.js +256 -0
- package/dist/worm_gear.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* spur_gear — SpurGear 最小实体构造(P0/P1:裸齿轮,无 bore/hub/spokes/chamfer)
|
|
3
|
+
*
|
|
4
|
+
* 对应 `SpurGear._build_gear_faces()` + `make_shell` + `Solid.makeSolid`:
|
|
5
|
+
*
|
|
6
|
+
* ```
|
|
7
|
+
* ① 4 段齿廓 → 4 个齿面(spline-face 三方案可切换)
|
|
8
|
+
* ② 每个齿面绕 Z 旋转 tau*i,得到 z 个齿的 4z 个面
|
|
9
|
+
* ③ 顶/底面:取所有位于 z=0 / z=width 的边 → 组线 → 成面
|
|
10
|
+
* ④ sew(faces, shell_sewing_tol) → makeSolid(shell)
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* cq 用 `Wire.combine(edges, tol)` 组线(带容差排序);faijs 侧用
|
|
14
|
+
* `makeWire(edges)` + `healWire(wire, tol)` 复现,容差取同一个 `wire_comb_tol`。
|
|
15
|
+
*/
|
|
16
|
+
import { GEAR_BASE_CONSTANTS } from './profile.js';
|
|
17
|
+
import { toothFaceGrids } from './profile.js';
|
|
18
|
+
import { spurGearGeometry, hyperbolicGearGeometry } from './profile.js';
|
|
19
|
+
import { buildSplineFace, DEFAULT_SPLINE_FACE_STRATEGY, } from './spline-face.js';
|
|
20
|
+
import { connectEdgesToWires } from '@faicad/cq-compat';
|
|
21
|
+
import { applyChamfer, applyBore, applyRecess, applyHub, applySpokes, applyMissingTeeth, } from './features.js';
|
|
22
|
+
/** 判定「边是否落在某个 z 平面上」的容差(远小于 wire_comb_tol)。 */
|
|
23
|
+
const PLANAR_PICK_TOL = 1e-6;
|
|
24
|
+
/**
|
|
25
|
+
* 把一批面中位于 `z` 平面上的边界边收集成一个平面盖面。
|
|
26
|
+
*
|
|
27
|
+
* @throws 内核抛错时原样上抛
|
|
28
|
+
*
|
|
29
|
+
* @param kernel 原始 OCCT 内核
|
|
30
|
+
* @param faces 齿面集合(已含 z 向厚度)
|
|
31
|
+
* @param z 目标平面高度
|
|
32
|
+
* @param wireCombTol 组线容差(mm)
|
|
33
|
+
* @returns 平面盖面(Face)
|
|
34
|
+
*/
|
|
35
|
+
export function planarCapAtZ(kernel, faces, z, wireCombTol = GEAR_BASE_CONSTANTS.wire_comb_tol) {
|
|
36
|
+
const edges = [];
|
|
37
|
+
for (const f of faces) {
|
|
38
|
+
for (const e of kernel.getSubShapes(f, 'edge')) {
|
|
39
|
+
const bb = kernel.getBoundingBox(e);
|
|
40
|
+
if (Math.abs(bb.zmin - z) <= PLANAR_PICK_TOL && Math.abs(bb.zmax - z) <= PLANAR_PICK_TOL) {
|
|
41
|
+
edges.push(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (edges.length === 0) {
|
|
46
|
+
throw new Error(`planarCapAtZ: no boundary edges found at z=${z}`);
|
|
47
|
+
}
|
|
48
|
+
const wires = connectEdgesToWires(kernel, edges, wireCombTol);
|
|
49
|
+
if (wires.length !== 1) {
|
|
50
|
+
throw new Error(`planarCapAtZ: expected one closed loop at z=${z}, got ${wires.length} wires from ${edges.length} edges`);
|
|
51
|
+
}
|
|
52
|
+
return kernel.makeFace(kernel.healWire(wires[0], wireCombTol));
|
|
53
|
+
}
|
|
54
|
+
/** ①+②:4z 个齿面(不含顶/底面)。
|
|
55
|
+
*
|
|
56
|
+
* @param kernel 原始 OCCT 内核
|
|
57
|
+
* @param geom 齿轮几何量
|
|
58
|
+
* @param strategy 齿面建面策略
|
|
59
|
+
* @param options 容差/次数选项
|
|
60
|
+
* @returns 齿面列表(4z 个 Face)
|
|
61
|
+
*/
|
|
62
|
+
export function buildToothFaces(kernel, geom, strategy, options = {}) {
|
|
63
|
+
const grids = toothFaceGrids(geom);
|
|
64
|
+
const base = grids.map((grid) => buildSplineFace(kernel, grid, strategy, options));
|
|
65
|
+
const faces = [];
|
|
66
|
+
const axis = { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } };
|
|
67
|
+
for (let i = 0; i < geom.z; i++) {
|
|
68
|
+
const angle = geom.tau * i;
|
|
69
|
+
for (const f of base) {
|
|
70
|
+
faces.push(i === 0 ? f : kernel.rotate(f, axis, angle));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return faces;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* ①+②:人字齿(Herringbone)的 8z 个齿面(上下两半 V 形)。
|
|
77
|
+
*
|
|
78
|
+
* 对应 cq_gears `HerringboneGear._build_tooth_faces`:调父类两次,
|
|
79
|
+
* 上半 `(0, +twist, 0, w/2)`、下半 `(+twist, 0, w/2, w/2)`,两半在 z=w/2 处
|
|
80
|
+
* 以相同扭转角衔接(点集重合,sew 自动并合)。
|
|
81
|
+
*
|
|
82
|
+
* @param kernel 原始 OCCT 内核
|
|
83
|
+
* @param geom 齿廓几何量
|
|
84
|
+
* @param strategy 齿面建面策略
|
|
85
|
+
* @param options 容差/次数选项
|
|
86
|
+
* @returns 齿面列表(8z 个 Face:4 段 × 2 半 × z 齿)
|
|
87
|
+
*/
|
|
88
|
+
export function buildHerringboneToothFaces(kernel, geom, strategy, options = {}) {
|
|
89
|
+
const w = geom.width;
|
|
90
|
+
// 上半:z ∈ [0, w/2],扭转 0 → +twist;下半:z ∈ [w/2, w],扭转 +twist → 0。
|
|
91
|
+
const grids1 = toothFaceGrids(geom, 0, geom.twistAngle, 0, w / 2);
|
|
92
|
+
const grids2 = toothFaceGrids(geom, geom.twistAngle, 0, w / 2, w / 2);
|
|
93
|
+
const base1 = grids1.map((grid) => buildSplineFace(kernel, grid, strategy, options));
|
|
94
|
+
const base2 = grids2.map((grid) => buildSplineFace(kernel, grid, strategy, options));
|
|
95
|
+
const faces = [];
|
|
96
|
+
const axis = { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } };
|
|
97
|
+
for (let i = 0; i < geom.z; i++) {
|
|
98
|
+
const angle = geom.tau * i;
|
|
99
|
+
for (const f of base1)
|
|
100
|
+
faces.push(i === 0 ? f : kernel.rotate(f, axis, angle));
|
|
101
|
+
for (const f of base2)
|
|
102
|
+
faces.push(i === 0 ? f : kernel.rotate(f, axis, angle));
|
|
103
|
+
}
|
|
104
|
+
return faces;
|
|
105
|
+
}
|
|
106
|
+
/** ③–④:由**已算好**的齿廓几何量构造裸齿轮实体(SpurGear 全族共用)。
|
|
107
|
+
*
|
|
108
|
+
* 与类无关:只吃 `SpurGearGeometry`(Spur / Herringbone / CrossedHelical 的齿廓布局
|
|
109
|
+
* 同构),所以子类(如 CrossedHelical)只要先用自己的公式算出 `geom`,即可复用它。
|
|
110
|
+
*
|
|
111
|
+
* @param kernel 原始 OCCT 内核
|
|
112
|
+
* @param geom 齿廓几何量(`spurGearGeometry` / `crossedHelicalGearGeometry` 的产物)
|
|
113
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
114
|
+
* @returns 朝向归一化后的 solid
|
|
115
|
+
*/
|
|
116
|
+
export function buildGearSolid(kernel, geom, build = {}) {
|
|
117
|
+
const strategy = build.strategy ?? DEFAULT_SPLINE_FACE_STRATEGY;
|
|
118
|
+
const faces = build.herringbone
|
|
119
|
+
? buildHerringboneToothFaces(kernel, geom, strategy, build)
|
|
120
|
+
: buildToothFaces(kernel, geom, strategy, build);
|
|
121
|
+
const bottom = planarCapAtZ(kernel, faces, 0, build.wireCombTol);
|
|
122
|
+
const top = planarCapAtZ(kernel, faces, geom.width, build.wireCombTol);
|
|
123
|
+
const all = [...faces, top, bottom];
|
|
124
|
+
const shell = kernel.sew(all, build.shellSewingTol ?? GEAR_BASE_CONSTANTS.shell_sewing_tol);
|
|
125
|
+
const solid = kernel.makeSolid(shell);
|
|
126
|
+
// `sew` 不保证面朝向一致(实测 2026-09-08:loft 蒙皮得到的齿面法向朝内,
|
|
127
|
+
// 缝出的实体体积为 −1111.7107)。`fixFaceOrientations` 是拓扑朝向归一化,
|
|
128
|
+
// 不改变几何——用它而不是去改面的构造方式。
|
|
129
|
+
const oriented = kernel.fixFaceOrientations(solid);
|
|
130
|
+
if (!kernel.isSolid(oriented)) {
|
|
131
|
+
throw new Error(`buildGearSolid: result is not a solid (got ${String(kernel.getShapeType(oriented))})`);
|
|
132
|
+
}
|
|
133
|
+
// 镀铬特征:cq `_build` 顺序 chamfer → bore → missing_teeth → recess → hub → spokes,
|
|
134
|
+
// 全部是在完整体上的布尔差/并,故放在 sew+makeSolid 之后。
|
|
135
|
+
let result = oriented;
|
|
136
|
+
if (build.chamfer !== undefined || build.chamferTop !== undefined || build.chamferBottom !== undefined) {
|
|
137
|
+
result = applyChamfer(kernel, result, geom.ra, geom.width, build, false);
|
|
138
|
+
}
|
|
139
|
+
if (build.boreD !== undefined) {
|
|
140
|
+
result = applyBore(kernel, result, build.boreD, geom.width);
|
|
141
|
+
}
|
|
142
|
+
if (build.missingTeeth !== undefined && build.missingTeeth.length > 0) {
|
|
143
|
+
result = applyMissingTeeth(kernel, result, {
|
|
144
|
+
ra: geom.ra, rd: geom.rd, tau: geom.tau, width: geom.width, twistAngle: geom.twistAngle,
|
|
145
|
+
}, build.missingTeeth);
|
|
146
|
+
}
|
|
147
|
+
if (build.recess !== undefined || build.bottomRecess !== undefined) {
|
|
148
|
+
result = applyRecess(kernel, result, geom.width, build);
|
|
149
|
+
}
|
|
150
|
+
if (build.hubLength !== undefined) {
|
|
151
|
+
result = applyHub(kernel, result, geom.width, build);
|
|
152
|
+
}
|
|
153
|
+
if (build.nSpokes !== undefined) {
|
|
154
|
+
// cq 语义:spokes_id 缺省 = hub_d、spokes_od 缺省 = recess_d
|
|
155
|
+
result = applySpokes(kernel, result, geom.width, {
|
|
156
|
+
...build,
|
|
157
|
+
spokesId: build.spokesId ?? build.hubD,
|
|
158
|
+
spokesOd: build.spokesOd ?? build.recessD,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
if (!kernel.isSolid(result)) {
|
|
162
|
+
throw new Error(`buildGearSolid: result is not a solid after features (got ${String(kernel.getShapeType(result))})`);
|
|
163
|
+
}
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
/** ①–④:完整 SpurGear 实体(裸齿轮)。
|
|
167
|
+
*
|
|
168
|
+
* @param kernel 原始 OCCT 内核
|
|
169
|
+
* @param params 齿轮参数
|
|
170
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
171
|
+
* @returns 朝向归一化后的 solid
|
|
172
|
+
*/
|
|
173
|
+
export function buildSpurGearSolid(kernel, params, build = {}) {
|
|
174
|
+
return buildGearSolid(kernel, spurGearGeometry(params), build);
|
|
175
|
+
}
|
|
176
|
+
/** ①–④:完整 HerringboneGear 实体(人字齿,裸齿轮)。
|
|
177
|
+
*
|
|
178
|
+
* 齿廓数学与 SpurGear 同构(`gearGeometryForClass` 已分派到 `spurGearGeometry`),
|
|
179
|
+
* 差异只在建面阶段:齿面沿宽度拆成上下两半、反向螺旋形成 V 形,由
|
|
180
|
+
* `buildHerringboneToothFaces` 实现;顶/底盖面与 SpurGear 一致(z=0 与 z=width 处
|
|
181
|
+
* 截面均为基准渐开线,净扭转回零)。
|
|
182
|
+
*
|
|
183
|
+
* @param kernel 原始 OCCT 内核
|
|
184
|
+
* @param params 齿轮参数(逐字沿用 Python 构造参数名)
|
|
185
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
186
|
+
* @returns 朝向归一化后的 solid
|
|
187
|
+
*/
|
|
188
|
+
export function buildHerringboneGearSolid(kernel, params, build = {}) {
|
|
189
|
+
return buildGearSolid(kernel, spurGearGeometry(params), { ...build, herringbone: true });
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* ①–④:完整 HyperbolicGear 实体(双曲面齿轮,裸齿轮)。
|
|
193
|
+
*
|
|
194
|
+
* 齿廓数学与 SpurGear 同构,差异只在 `twist_angle` 来自显式构造参数(见
|
|
195
|
+
* `hyperbolicGearGeometry`)、`surfaceSplines=2`;实体构造完全复用通用的
|
|
196
|
+
* `buildGearSolid`。
|
|
197
|
+
*
|
|
198
|
+
* @param kernel 原始 OCCT 内核
|
|
199
|
+
* @param params 双曲面齿轮参数(逐字沿用 Python 构造参数名)
|
|
200
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
201
|
+
* @returns 朝向归一化后的 solid
|
|
202
|
+
*/
|
|
203
|
+
export function buildHyperbolicGearSolid(kernel, params, build = {}) {
|
|
204
|
+
return buildGearSolid(kernel, hyperbolicGearGeometry(params), build);
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=spur_gear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spur_gear.js","sourceRoot":"","sources":["../src/spur_gear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worm_gear — Worm 蜗杆实体构造
|
|
3
|
+
*
|
|
4
|
+
* 对应 cq_gears `Worm._build_tooth_faces()` + `_build_gear_faces()` +
|
|
5
|
+
* `make_shell` + `Solid.makeSolid`(`worm_gear.py`)。蜗杆轴向沿 **X**,
|
|
6
|
+
* 齿面 = 齿条齿廓(与 RackGear 同构的梯形直线段)绕 X 轴的螺旋扫掠:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* ① 4 段齿廓 × 8 个螺旋站位 → 4 张 8×2 点阵 B-spline 面(t_faces)
|
|
10
|
+
* ② 每张面绕 X 转 −n·part_turn、平移 step_x·n(n=0,1)→ 8 张面(一个导程的 2 part)
|
|
11
|
+
* ③ 每头绕 X 转 tau·th(th=0..n_threads-1),再沿 X 以 step 为周期平移 turns 份 → nfaces
|
|
12
|
+
* ④ 端面 x=±length/2 处修剪越界面 + 由修剪边界边组端盖面
|
|
13
|
+
* ⑤ sew(g_faces, shell_sewing_tol) → makeSolid → fixFaceOrientations → bore
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* 与 Python 的差异(有意为之,几何等价):
|
|
17
|
+
* - 端面截面不用 `GeomAPI_IntSS` 曲面求交:修剪后的面在 x=±L/2 处的边界边
|
|
18
|
+
* 就是 IntSS 的交线,直接收集修剪面的平面边组线成面,曲线集相同。
|
|
19
|
+
* - 越界修剪用 `kernel.split`(BRepAlgoAPI_Splitter)复刻 `face.split`:
|
|
20
|
+
* 只在 bbox 越界时分割,按 Python 的选择规则取内侧片(左端取 xmax 最大片、
|
|
21
|
+
* 右端取 xmin 最小片)。
|
|
22
|
+
*/
|
|
23
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
24
|
+
import type { GearKernel } from '@faicad/cq-compat';
|
|
25
|
+
import { type WormGeometry, type WormParams } from './profile.js';
|
|
26
|
+
import { type SplineFaceOptions, type SplineFaceStrategy } from './spline-face.js';
|
|
27
|
+
/** Worm 实体构造选项。 */
|
|
28
|
+
export interface BuildWormOptions extends SplineFaceOptions {
|
|
29
|
+
strategy?: SplineFaceStrategy;
|
|
30
|
+
/** 缝合容差(cq `shell_sewing_tol`,GearBase 默认 1e-2)。 */
|
|
31
|
+
shellSewingTol?: number;
|
|
32
|
+
/** 组线容差(cq `wire_comb_tol`,Worm 覆写为 0.1)。 */
|
|
33
|
+
wireCombTol?: number;
|
|
34
|
+
/** 轴孔直径(沿 X 轴贯穿,`Worm._make_bore`)。 */
|
|
35
|
+
boreD?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ①+②:一个导程内 2 part × 4 段 = 8 张螺旋齿面。
|
|
39
|
+
*
|
|
40
|
+
* 复刻 `Worm._build_tooth_faces`:每段齿廓(2 点直线)沿螺旋站位
|
|
41
|
+
* `(tx, alpha) ~ linspace((start_x, 0), (start_x+step_x, part_turn), 8)`
|
|
42
|
+
* 平移 `(tx, r0, 0)` 后绕 X 旋转(行向量左乘约定,见 `math.ts` 顶部说明),
|
|
43
|
+
* 8×2 点阵建面;再按 part 拆分旋转/平移。
|
|
44
|
+
*
|
|
45
|
+
* @param kernel 原始 OCCT 内核
|
|
46
|
+
* @param geom 蜗杆几何量
|
|
47
|
+
* @param strategy 齿面建面策略
|
|
48
|
+
* @param options 容差/次数选项
|
|
49
|
+
* @returns 8 张齿面(Face)
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildWormToothFaces(kernel: GearKernel, geom: WormGeometry, strategy: SplineFaceStrategy, options?: SplineFaceOptions): BrepHandle[];
|
|
52
|
+
/**
|
|
53
|
+
* ③+④:全齿面集合(多头 × 多圈 + 两端修剪 + 端盖面)。
|
|
54
|
+
*
|
|
55
|
+
* 复刻 `Worm._build_gear_faces`:
|
|
56
|
+
* - `step = π·m·n_threads`(轴向导程),`turns = ceil(length/step) + 2`,
|
|
57
|
+
* 起始平移 `step/2 + x_start + i·step`(x_start = −turns·step/2);
|
|
58
|
+
* - 每头先绕 X 转 `tau·th`(tau = 2π/n_threads),再按圈平移;
|
|
59
|
+
* - x=±length/2 处修剪越界面(左端取 xmax 最大片 / 右端取 xmin 最小片,
|
|
60
|
+
* 与 Python `max(get_xmax)` / `min(get_xmin)` 一致),并补两端盖面。
|
|
61
|
+
*
|
|
62
|
+
* @param kernel 原始 OCCT 内核
|
|
63
|
+
* @param geom 蜗杆几何量
|
|
64
|
+
* @param strategy 齿面建面策略
|
|
65
|
+
* @param options 容差/次数选项
|
|
66
|
+
* @returns 修剪后的全部面(含两端盖)
|
|
67
|
+
*/
|
|
68
|
+
export declare function buildWormGearFaces(kernel: GearKernel, geom: WormGeometry, strategy: SplineFaceStrategy, options?: SplineFaceOptions): BrepHandle[];
|
|
69
|
+
/**
|
|
70
|
+
* ①–⑤:完整 Worm 实体(裸蜗杆,可选轴孔)。
|
|
71
|
+
*
|
|
72
|
+
* @param kernel 原始 OCCT 内核
|
|
73
|
+
* @param params 蜗杆参数(逐字沿用 Python 构造参数名)
|
|
74
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
75
|
+
* @returns 朝向归一化后的 solid
|
|
76
|
+
*/
|
|
77
|
+
export declare function buildWormSolid(kernel: GearKernel, params: WormParams, build?: BuildWormOptions): BrepHandle;
|
|
78
|
+
//# sourceMappingURL=worm_gear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worm_gear.d.ts","sourceRoot":"","sources":["../src/worm_gear.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAEW,KAAK,YAAY,EAAE,KAAK,UAAU,EACnD,MAAM,WAAW,CAAA;AAElB,OAAO,EAEL,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAChD,MAAM,eAAe,CAAA;AAWtB,mBAAmB;AACnB,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAcD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,UAAU,EAAE,CAyCd;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,UAAU,EAAE,CAyGd;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,UAAU,EAClB,KAAK,GAAE,gBAAqB,GAC3B,UAAU,CAmCZ"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worm_gear — Worm 蜗杆实体构造
|
|
3
|
+
*
|
|
4
|
+
* 对应 cq_gears `Worm._build_tooth_faces()` + `_build_gear_faces()` +
|
|
5
|
+
* `make_shell` + `Solid.makeSolid`(`worm_gear.py`)。蜗杆轴向沿 **X**,
|
|
6
|
+
* 齿面 = 齿条齿廓(与 RackGear 同构的梯形直线段)绕 X 轴的螺旋扫掠:
|
|
7
|
+
*
|
|
8
|
+
* ```
|
|
9
|
+
* ① 4 段齿廓 × 8 个螺旋站位 → 4 张 8×2 点阵 B-spline 面(t_faces)
|
|
10
|
+
* ② 每张面绕 X 转 −n·part_turn、平移 step_x·n(n=0,1)→ 8 张面(一个导程的 2 part)
|
|
11
|
+
* ③ 每头绕 X 转 tau·th(th=0..n_threads-1),再沿 X 以 step 为周期平移 turns 份 → nfaces
|
|
12
|
+
* ④ 端面 x=±length/2 处修剪越界面 + 由修剪边界边组端盖面
|
|
13
|
+
* ⑤ sew(g_faces, shell_sewing_tol) → makeSolid → fixFaceOrientations → bore
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* 与 Python 的差异(有意为之,几何等价):
|
|
17
|
+
* - 端面截面不用 `GeomAPI_IntSS` 曲面求交:修剪后的面在 x=±L/2 处的边界边
|
|
18
|
+
* 就是 IntSS 的交线,直接收集修剪面的平面边组线成面,曲线集相同。
|
|
19
|
+
* - 越界修剪用 `kernel.split`(BRepAlgoAPI_Splitter)复刻 `face.split`:
|
|
20
|
+
* 只在 bbox 越界时分割,按 Python 的选择规则取内侧片(左端取 xmax 最大片、
|
|
21
|
+
* 右端取 xmin 最小片)。
|
|
22
|
+
*/
|
|
23
|
+
import { wormGeometry, } from './profile.js';
|
|
24
|
+
import { rotateRows, vec3 } from './math.js';
|
|
25
|
+
import { buildSplineFace, } from './spline-face.js';
|
|
26
|
+
import { connectEdgesToWires } from '@faicad/cq-compat';
|
|
27
|
+
/** Worm 覆写 GearBase 的类常量(`worm_gear.py` 类属性)。 */
|
|
28
|
+
const WORM_SURFACE_SPLINES = 8;
|
|
29
|
+
const WORM_WIRE_COMB_TOL = 0.1;
|
|
30
|
+
const WORM_T_FACE_PARTS = 2;
|
|
31
|
+
/** 判定「边是否落在某个 x 平面上」的容差(与 spur_gear 的 PLANAR_PICK_TOL 同级)。 */
|
|
32
|
+
const PLANAR_PICK_TOL = 1e-6;
|
|
33
|
+
/** 齿廓 4 段(顺序与 Python `_build_tooth_faces` 的循环一致)。 */
|
|
34
|
+
const WORM_SEGMENTS = ['lflank', 'tip', 'rflank', 'root'];
|
|
35
|
+
function segmentPoints(geom, seg) {
|
|
36
|
+
switch (seg) {
|
|
37
|
+
case 'lflank': return geom.t_lflank_pts;
|
|
38
|
+
case 'tip': return geom.t_tip_pts;
|
|
39
|
+
case 'rflank': return geom.t_rflank_pts;
|
|
40
|
+
case 'root': return geom.t_root_pts;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* ①+②:一个导程内 2 part × 4 段 = 8 张螺旋齿面。
|
|
45
|
+
*
|
|
46
|
+
* 复刻 `Worm._build_tooth_faces`:每段齿廓(2 点直线)沿螺旋站位
|
|
47
|
+
* `(tx, alpha) ~ linspace((start_x, 0), (start_x+step_x, part_turn), 8)`
|
|
48
|
+
* 平移 `(tx, r0, 0)` 后绕 X 旋转(行向量左乘约定,见 `math.ts` 顶部说明),
|
|
49
|
+
* 8×2 点阵建面;再按 part 拆分旋转/平移。
|
|
50
|
+
*
|
|
51
|
+
* @param kernel 原始 OCCT 内核
|
|
52
|
+
* @param geom 蜗杆几何量
|
|
53
|
+
* @param strategy 齿面建面策略
|
|
54
|
+
* @param options 容差/次数选项
|
|
55
|
+
* @returns 8 张齿面(Face)
|
|
56
|
+
*/
|
|
57
|
+
export function buildWormToothFaces(kernel, geom, strategy, options = {}) {
|
|
58
|
+
const ttx = geom.m * Math.PI * geom.nThreads;
|
|
59
|
+
const startX = -ttx / 2.0;
|
|
60
|
+
const stepX = ttx / WORM_T_FACE_PARTS;
|
|
61
|
+
const partTurn = (Math.PI * 2.0) / WORM_T_FACE_PARTS * Math.sign(geom.leadAngle);
|
|
62
|
+
// np.linspace((start_x, 0), (start_x + step_x, part_turn), surface_splines)
|
|
63
|
+
const stations = [];
|
|
64
|
+
for (let i = 0; i < WORM_SURFACE_SPLINES; i++) {
|
|
65
|
+
const f = i / (WORM_SURFACE_SPLINES - 1);
|
|
66
|
+
stations.push({ tx: startX + stepX * f, alpha: partTurn * f });
|
|
67
|
+
}
|
|
68
|
+
const axisX = { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } };
|
|
69
|
+
const tFaces = [];
|
|
70
|
+
for (const seg of WORM_SEGMENTS) {
|
|
71
|
+
const spline = segmentPoints(geom, seg);
|
|
72
|
+
// 每站位:spline + (tx, r0, 0),再 @ rotation_matrix((1,0,0), alpha)
|
|
73
|
+
const rows = stations.map(({ tx, alpha }) => rotateRows(spline.map((p) => vec3(p.x + tx, p.y + geom.r0, p.z)), { x: 1, y: 0, z: 0 }, alpha));
|
|
74
|
+
const grid = { segment: seg, rows: rows.length, cols: rows[0].length, points: rows };
|
|
75
|
+
tFaces.push(buildSplineFace(kernel, grid, strategy, options));
|
|
76
|
+
}
|
|
77
|
+
// for n in range(t_face_parts): rotate(-n·part_turn).translate((step_x·n, 0, 0))
|
|
78
|
+
const faces = [];
|
|
79
|
+
for (let n = 0; n < WORM_T_FACE_PARTS; n++) {
|
|
80
|
+
for (const tf of tFaces) {
|
|
81
|
+
let f = tf;
|
|
82
|
+
if (n !== 0)
|
|
83
|
+
f = kernel.rotate(f, axisX, -n * partTurn);
|
|
84
|
+
if (n !== 0)
|
|
85
|
+
f = kernel.translate(f, stepX * n, 0, 0);
|
|
86
|
+
faces.push(f);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return faces;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* ③+④:全齿面集合(多头 × 多圈 + 两端修剪 + 端盖面)。
|
|
93
|
+
*
|
|
94
|
+
* 复刻 `Worm._build_gear_faces`:
|
|
95
|
+
* - `step = π·m·n_threads`(轴向导程),`turns = ceil(length/step) + 2`,
|
|
96
|
+
* 起始平移 `step/2 + x_start + i·step`(x_start = −turns·step/2);
|
|
97
|
+
* - 每头先绕 X 转 `tau·th`(tau = 2π/n_threads),再按圈平移;
|
|
98
|
+
* - x=±length/2 处修剪越界面(左端取 xmax 最大片 / 右端取 xmin 最小片,
|
|
99
|
+
* 与 Python `max(get_xmax)` / `min(get_xmin)` 一致),并补两端盖面。
|
|
100
|
+
*
|
|
101
|
+
* @param kernel 原始 OCCT 内核
|
|
102
|
+
* @param geom 蜗杆几何量
|
|
103
|
+
* @param strategy 齿面建面策略
|
|
104
|
+
* @param options 容差/次数选项
|
|
105
|
+
* @returns 修剪后的全部面(含两端盖)
|
|
106
|
+
*/
|
|
107
|
+
export function buildWormGearFaces(kernel, geom, strategy, options = {}) {
|
|
108
|
+
const step = Math.PI * geom.m * geom.nThreads;
|
|
109
|
+
const turns = Math.ceil(geom.length / step) + 2;
|
|
110
|
+
const xStart = (-turns * step) / 2.0;
|
|
111
|
+
const tau = (Math.PI * 2.0) / geom.nThreads;
|
|
112
|
+
const tFaces = buildWormToothFaces(kernel, geom, strategy, options);
|
|
113
|
+
const axisX = { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } };
|
|
114
|
+
// 每头旋转 tau·th,再按圈平移 → nfaces
|
|
115
|
+
// ⚠️ Python 是无条件 translate(含 i=0:dx = step/2 + x_start ≠ 0),
|
|
116
|
+
// 不能像旋转 tau·0=0 那样跳过,否则第一组齿面整体错位。
|
|
117
|
+
const nfaces = [];
|
|
118
|
+
for (let th = 0; th < geom.nThreads; th++) {
|
|
119
|
+
const rot = th === 0 ? tFaces : tFaces.map((f) => kernel.rotate(f, axisX, tau * th));
|
|
120
|
+
for (let i = 0; i < turns; i++) {
|
|
121
|
+
const dx = step / 2.0 + xStart + i * step;
|
|
122
|
+
for (const f of rot)
|
|
123
|
+
nfaces.push(kernel.translate(f, dx, 0, 0));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// 端面修剪:cp_size = ra·2+2 的方形截平面
|
|
127
|
+
const half = geom.ra + 1.0;
|
|
128
|
+
const cpX = geom.length / 2.0;
|
|
129
|
+
const cutPlaneAt = (x) => {
|
|
130
|
+
const c = vec3(x, -half, -half);
|
|
131
|
+
const edges = [
|
|
132
|
+
kernel.makeLineEdge(c, vec3(x, half, -half)),
|
|
133
|
+
kernel.makeLineEdge(vec3(x, half, -half), vec3(x, half, half)),
|
|
134
|
+
kernel.makeLineEdge(vec3(x, half, half), vec3(x, -half, half)),
|
|
135
|
+
kernel.makeLineEdge(vec3(x, -half, half), c),
|
|
136
|
+
];
|
|
137
|
+
return kernel.makeFace(kernel.makeWire(edges));
|
|
138
|
+
};
|
|
139
|
+
const leftPlane = cutPlaneAt(-cpX);
|
|
140
|
+
const rightPlane = cutPlaneAt(cpX);
|
|
141
|
+
const gFaces = [];
|
|
142
|
+
for (const face of nfaces) {
|
|
143
|
+
const bb = kernel.getBoundingBox(face);
|
|
144
|
+
if (bb.xmin > -cpX && bb.xmax < cpX) {
|
|
145
|
+
gFaces.push(face);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// ⚠️ Python `face.split` 只在平面真正切到面时返回 Compound(isinstance 检查),
|
|
149
|
+
// 完全在端面之外的面被静默跳过——这里必须同样跳过,否则外部散面会撑破 shell。
|
|
150
|
+
if (bb.xmin < -cpX && bb.xmax > -cpX) {
|
|
151
|
+
// 左端越界:split 后取 xmax 最大的片(Python `max(list(cpd), key=get_xmax)`)
|
|
152
|
+
const pieces = kernel.getSubShapes(kernel.split(face, [leftPlane]), 'face');
|
|
153
|
+
let best;
|
|
154
|
+
let bestX = -Infinity;
|
|
155
|
+
for (const p of pieces) {
|
|
156
|
+
const x = kernel.getBoundingBox(p).xmax;
|
|
157
|
+
if (x > bestX) {
|
|
158
|
+
bestX = x;
|
|
159
|
+
best = p;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (best)
|
|
163
|
+
gFaces.push(best);
|
|
164
|
+
}
|
|
165
|
+
else if (bb.xmax > cpX && bb.xmin < cpX) {
|
|
166
|
+
// 右端越界:取 xmin 最小的片(Python `min(list(cpd), key=get_xmin)`)
|
|
167
|
+
const pieces = kernel.getSubShapes(kernel.split(face, [rightPlane]), 'face');
|
|
168
|
+
let best;
|
|
169
|
+
let bestX = Infinity;
|
|
170
|
+
for (const p of pieces) {
|
|
171
|
+
const x = kernel.getBoundingBox(p).xmin;
|
|
172
|
+
if (x < bestX) {
|
|
173
|
+
bestX = x;
|
|
174
|
+
best = p;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (best)
|
|
178
|
+
gFaces.push(best);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// 端盖面:从修剪后的保留面收集位于 x=±cpX 平面上的边界边 → 组线 → 成面。
|
|
182
|
+
// split 生成的切边界边共享顶点、几何精确,比 kernel.section(对右端平面
|
|
183
|
+
// 实测会漏交线)可靠;4 段 × 2 part 的截面曲线恰构成一条闭环。
|
|
184
|
+
const capAt = (x) => {
|
|
185
|
+
const edges = [];
|
|
186
|
+
for (const f of gFaces) {
|
|
187
|
+
for (const e of kernel.getSubShapes(f, 'edge')) {
|
|
188
|
+
const bb = kernel.getBoundingBox(e);
|
|
189
|
+
if (Math.abs(bb.xmin - x) <= PLANAR_PICK_TOL && Math.abs(bb.xmax - x) <= PLANAR_PICK_TOL) {
|
|
190
|
+
edges.push(e);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (edges.length === 0) {
|
|
195
|
+
throw new Error(`buildWormGearFaces: no boundary edges found at x=${x}`);
|
|
196
|
+
}
|
|
197
|
+
const wires = connectEdgesToWires(kernel, edges, WORM_WIRE_COMB_TOL);
|
|
198
|
+
if (wires.length === 0) {
|
|
199
|
+
throw new Error(`buildWormGearFaces: no closed loop at x=${x} from ${edges.length} edges`);
|
|
200
|
+
}
|
|
201
|
+
// 接缝处可能产生小碎环(两条 wire);确定性取 bbox 面积最大的环(真实端面边界)
|
|
202
|
+
let cap = wires[0];
|
|
203
|
+
if (wires.length > 1) {
|
|
204
|
+
let bestArea = -1;
|
|
205
|
+
for (const w of wires) {
|
|
206
|
+
const bb = kernel.getBoundingBox(w);
|
|
207
|
+
const area = (bb.ymax - bb.ymin) * (bb.zmax - bb.zmin);
|
|
208
|
+
if (area > bestArea) {
|
|
209
|
+
bestArea = area;
|
|
210
|
+
cap = w;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return kernel.makeFace(kernel.healWire(cap, WORM_WIRE_COMB_TOL));
|
|
215
|
+
};
|
|
216
|
+
gFaces.push(capAt(-cpX));
|
|
217
|
+
gFaces.push(capAt(cpX));
|
|
218
|
+
return gFaces;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* ①–⑤:完整 Worm 实体(裸蜗杆,可选轴孔)。
|
|
222
|
+
*
|
|
223
|
+
* @param kernel 原始 OCCT 内核
|
|
224
|
+
* @param params 蜗杆参数(逐字沿用 Python 构造参数名)
|
|
225
|
+
* @param build 构造选项(策略/容差覆盖)
|
|
226
|
+
* @returns 朝向归一化后的 solid
|
|
227
|
+
*/
|
|
228
|
+
export function buildWormSolid(kernel, params, build = {}) {
|
|
229
|
+
const geom = wormGeometry(params);
|
|
230
|
+
// cq `Face.makeSplineApprox` 对整块点阵一次性拟合 —— 与 grid-approx
|
|
231
|
+
// (GeomAPI_PointsToBSplineSurface)同族;逐行 loft 的行间误差在这里会被
|
|
232
|
+
// 螺旋面放大(实测 rel≈1.4e-3 vs 参考体积),故 Worm 默认用 grid-approx。
|
|
233
|
+
const strategy = build.strategy ?? 'grid-approx';
|
|
234
|
+
const faces = buildWormGearFaces(kernel, geom, strategy, build);
|
|
235
|
+
// 蜗杆齿面是逐段独立逼近的 B-spline 面,相邻面边界只有 ~spline_approx_tol
|
|
236
|
+
// (0.01)量级的贴合度,实测接缝间隙 ≈0.0105 恰好卡在 cq shell_sewing_tol=0.01
|
|
237
|
+
// 之上导致 sew 不封闭,故把缝合容差放宽到 0.05(几何不变,仅拓扑容差)。
|
|
238
|
+
const solid = kernel.sewAndSolidify(faces, build.shellSewingTol ?? 0.05);
|
|
239
|
+
const oriented = kernel.fixFaceOrientations(solid);
|
|
240
|
+
if (!kernel.isSolid(oriented)) {
|
|
241
|
+
throw new Error(`buildWormSolid: result is not a solid (got ${String(kernel.getShapeType(oriented))})`);
|
|
242
|
+
}
|
|
243
|
+
// `Worm._make_bore`:YZ 工作面圆 + cutThruAll ⇒ 沿 X 轴贯穿的圆柱差
|
|
244
|
+
let result = oriented;
|
|
245
|
+
if (build.boreD !== undefined) {
|
|
246
|
+
const eps = 0.1;
|
|
247
|
+
const cyl = kernel.makeCylinder(build.boreD / 2, geom.length + 2 * eps);
|
|
248
|
+
const alongX = kernel.rotate(cyl, { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 1, z: 0 } }, Math.PI / 2);
|
|
249
|
+
result = kernel.cut(result, kernel.translate(alongX, -(geom.length / 2 + eps), 0, 0));
|
|
250
|
+
if (!kernel.isSolid(result)) {
|
|
251
|
+
throw new Error('buildWormSolid: result is not a solid after bore');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return result;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=worm_gear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worm_gear.js","sourceRoot":"","sources":["../src/worm_gear.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@faicad/fai-cq-gears",
|
|
3
|
+
"version": "0.13.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://gitcode.com/Faicad/faijs.git"
|
|
9
|
+
},
|
|
10
|
+
"description": "CadQuery gear extensions (spur, bevel, worm, rack, planetary) ported to faijs",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"cad",
|
|
13
|
+
"faijs",
|
|
14
|
+
"cadquery",
|
|
15
|
+
"gear",
|
|
16
|
+
"spur",
|
|
17
|
+
"bevel",
|
|
18
|
+
"worm"
|
|
19
|
+
],
|
|
20
|
+
"main": "./dist/index.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"exports": {
|
|
23
|
+
".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"@faicad/faijs": "^0.13.0",
|
|
31
|
+
"occt-wasm": "^3.8.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@faicad/cq-compat": "file:../cq-compat",
|
|
35
|
+
"@faicad/faijs": "file:../core",
|
|
36
|
+
"typescript": "*",
|
|
37
|
+
"vitest": "*"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.build.json && node ../../scripts/fix-import-extensions.mjs dist",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"test:spike": "vitest run src/profile.test.ts",
|
|
44
|
+
"lint": "eslint src",
|
|
45
|
+
"gen-reference": "pwsh -NoProfile scripts/gen-reference.ps1"
|
|
46
|
+
}
|
|
47
|
+
}
|