@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,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crossed_pair — 交错轴齿轮对(CrossedGearPair / HyperbolicGearPair)
|
|
3
|
+
*
|
|
4
|
+
* 对应 `crossed_helical_gear.py`:两个单体齿轮按轴交角装配成一个 Compound。
|
|
5
|
+
* 两件都各自用现成的实体构造(`buildCrossedHelicalSolid` / `buildHyperbolicGearSolid`),
|
|
6
|
+
* 差异只在**装配定位链**与**螺旋角分配**:
|
|
7
|
+
*
|
|
8
|
+
* ## 螺旋角分配(CrossedGearPair)
|
|
9
|
+
*
|
|
10
|
+
* `gear1_helix_angle is None` 时两齿轮各取 `shaft_angle/2`;否则
|
|
11
|
+
* `g1 = gear1_helix_angle`、`g2 = shaft_angle − gear1_helix_angle`。
|
|
12
|
+
*
|
|
13
|
+
* ## gear2 定位链(两种对类完全一致,仅 X 向偏移不同)
|
|
14
|
+
*
|
|
15
|
+
* Python(右到左复合 `loc = A; loc *= B; loc *= C; loc *= D` ⇒ 施加顺序 D→C→B→A):
|
|
16
|
+
*
|
|
17
|
+
* ```python
|
|
18
|
+
* loc = cq.Location(Vector(r0_1 + r0_2, 0, w1/2)) # A 平移
|
|
19
|
+
* loc *= cq.Location(Vector(0,0,0), X, shaft_angle) # B 绕原点 X 转
|
|
20
|
+
* loc *= cq.Location(Vector(0,0,-w2/2)) # C 平移
|
|
21
|
+
* loc *= cq.Location(Vector(0,0,0), Z, align_angle) # D 绕原点 Z 转
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* `align_angle = (0 if gear2.z%2 else 180/gear2.z) + degrees(gear2.twist + gear1.twist*ratio)/2`,
|
|
25
|
+
* `ratio = gear1.z / gear2.z`。
|
|
26
|
+
*
|
|
27
|
+
* ## X 向偏移差异
|
|
28
|
+
* - CrossedGearPair:用两齿轮分度半径之和 `r0_1 + r0_2`;
|
|
29
|
+
* - HyperbolicGearPair:用两齿轮**喉部半径**之和 `throat_r1 + throat_r2`。
|
|
30
|
+
*/
|
|
31
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
32
|
+
import type { GearKernel } from '@faicad/cq-compat';
|
|
33
|
+
import { crossedHelicalGearGeometry, type HyperbolicGearGeometry } from './profile.js';
|
|
34
|
+
import { type BuildSpurGearOptions } from './spur_gear.js';
|
|
35
|
+
/** 装配定位链的输入量(拆出来便于单测直接验证定位本身)。 */
|
|
36
|
+
export interface SecondGearPlacement {
|
|
37
|
+
/** gear2 绕 Z 的对齿/对齐角(弧度)。 */
|
|
38
|
+
alignAngleRad: number;
|
|
39
|
+
/** 轴交角(弧度)。 */
|
|
40
|
+
shaftAngleRad: number;
|
|
41
|
+
/** X 向平移量(Crossed 用 r0 和、Hyperbolic 用 throat_r 和)。 */
|
|
42
|
+
offsetX: number;
|
|
43
|
+
/** gear1 宽度(Z 向平移分量)。 */
|
|
44
|
+
gear1Width: number;
|
|
45
|
+
/** gear2 宽度(Z 向平移分量)。 */
|
|
46
|
+
gear2Width: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 把第二齿轮摆到与第一齿轮啮合的位姿(复刻 Python 的四步 `loc *=`)。
|
|
50
|
+
*
|
|
51
|
+
* 施加顺序 **D → C → B → A**:先绕原点 Z 转 `alignAngle`,再沿 Z 平移 `-w2/2`,
|
|
52
|
+
* 再绕原点 X 转 `shaftAngle`,最后沿 X 平移 `offsetX`、沿 Z 平移 `w1/2`。
|
|
53
|
+
*
|
|
54
|
+
* @param kernel 原始 OCCT 内核
|
|
55
|
+
* @param g2 第二齿轮 solid
|
|
56
|
+
* @param place 定位链输入量
|
|
57
|
+
* @returns 定位后的第二齿轮 solid
|
|
58
|
+
*/
|
|
59
|
+
export declare function placeSecondGear(kernel: GearKernel, g2: BrepHandle, place: SecondGearPlacement): BrepHandle;
|
|
60
|
+
/**
|
|
61
|
+
* 复刻 Python 的 `align_angle` 公式。
|
|
62
|
+
*
|
|
63
|
+
* `align_angle = (0 if gear2.z%2 else 180/gear2.z) + degrees(gear2.twist + gear1.twist*ratio)/2`,
|
|
64
|
+
* `ratio = gear1.z / gear2.z`。两个 twist 都用**弧度**(来自几何量)。
|
|
65
|
+
*
|
|
66
|
+
* @param gear1Z 第一齿轮齿数
|
|
67
|
+
* @param gear1TwistRad 第一齿轮扭转角(弧度)
|
|
68
|
+
* @param gear2Z 第二齿轮齿数
|
|
69
|
+
* @param gear2TwistRad 第二齿轮扭转角(弧度)
|
|
70
|
+
* @returns 对齐角(弧度)
|
|
71
|
+
*/
|
|
72
|
+
export declare function crossedPairAlignAngle(gear1Z: number, gear1TwistRad: number, gear2Z: number, gear2TwistRad: number): number;
|
|
73
|
+
/** 交错轴斜齿轮对参数(逐字沿用 `CrossedGearPair.__init__`)。 */
|
|
74
|
+
export interface CrossedGearPairParams {
|
|
75
|
+
module: number;
|
|
76
|
+
gear1_teeth_number: number;
|
|
77
|
+
gear2_teeth_number: number;
|
|
78
|
+
gear1_width: number;
|
|
79
|
+
gear2_width: number;
|
|
80
|
+
pressure_angle?: number;
|
|
81
|
+
shaft_angle?: number;
|
|
82
|
+
/** 第一齿轮螺旋角(度);`null`/缺省 = 两齿轮各取 `shaft_angle/2`。 */
|
|
83
|
+
gear1_helix_angle?: number | null;
|
|
84
|
+
clearance?: number;
|
|
85
|
+
backlash?: number;
|
|
86
|
+
}
|
|
87
|
+
/** 齿轮对构造选项(扩展单体特征选项 + 装配开关)。 */
|
|
88
|
+
export interface BuildCrossedGearPairOptions extends BuildSpurGearOptions {
|
|
89
|
+
/** 是否构建第一齿轮(默认 true)。 */
|
|
90
|
+
buildGear1?: boolean;
|
|
91
|
+
/** 是否构建第二齿轮(默认 true)。 */
|
|
92
|
+
buildGear2?: boolean;
|
|
93
|
+
/** 是否对 gear2 施加装配定位(默认 true)。 */
|
|
94
|
+
transformGear2?: boolean;
|
|
95
|
+
}
|
|
96
|
+
/** 交错轴斜齿轮对的构建结果。 */
|
|
97
|
+
export interface CrossedGearPairBuild {
|
|
98
|
+
/** 第一齿轮 solid(未定位)。 */
|
|
99
|
+
gear1?: BrepHandle;
|
|
100
|
+
/** 第二齿轮 solid(已定位)。 */
|
|
101
|
+
gear2?: BrepHandle;
|
|
102
|
+
gear1Geometry: ReturnType<typeof crossedHelicalGearGeometry>;
|
|
103
|
+
gear2Geometry: ReturnType<typeof crossedHelicalGearGeometry>;
|
|
104
|
+
/** 轴交角(弧度)。 */
|
|
105
|
+
shaftAngleRad: number;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 构建一对交错轴斜齿轮(`CrossedGearPair`)。
|
|
109
|
+
*
|
|
110
|
+
* 两件都走 `buildCrossedHelicalSolid`(用各自的 helix 角),差异只在参数:gear2 的
|
|
111
|
+
* helix 由 `shaft_angle − gear1_helix` 决定;gear2 默认按轴交角定位到与第一齿轮啮合。
|
|
112
|
+
*
|
|
113
|
+
* @param kernel 原始 OCCT 内核
|
|
114
|
+
* @param params 齿轮对参数
|
|
115
|
+
* @param options 构造选项
|
|
116
|
+
* @returns 两件 solid(gear2 默认已定位)与两件几何量
|
|
117
|
+
*/
|
|
118
|
+
export declare function buildCrossedGearPair(kernel: GearKernel, params: CrossedGearPairParams, options?: BuildCrossedGearPairOptions): CrossedGearPairBuild;
|
|
119
|
+
/**
|
|
120
|
+
* 一对交错轴斜齿轮的导出条目(gear1 → gear2)。
|
|
121
|
+
*
|
|
122
|
+
* @param build 交叉轴齿轮对构建结果(gear2 可能为空——只有 `shafts_connected` 时存在)
|
|
123
|
+
* @returns 具名实体数组(名字进 STEP 产品名,供逐件等价比对)
|
|
124
|
+
*/
|
|
125
|
+
export declare function crossedPairExportParts(build: CrossedGearPairBuild): Array<{
|
|
126
|
+
name: string;
|
|
127
|
+
solid: BrepHandle;
|
|
128
|
+
}>;
|
|
129
|
+
/** 双曲面齿轮对参数(逐字沿用 `HyperbolicGearPair.__init__`)。 */
|
|
130
|
+
export interface HyperbolicGearPairParams {
|
|
131
|
+
module: number;
|
|
132
|
+
gear1_teeth_number: number;
|
|
133
|
+
/** 齿宽(两齿轮共用,沿 X)。 */
|
|
134
|
+
width: number;
|
|
135
|
+
/** 轴交角(度)。 */
|
|
136
|
+
shaft_angle: number;
|
|
137
|
+
/** 第二齿轮齿数(缺省 = 第一齿轮齿数)。 */
|
|
138
|
+
gear2_teeth_number?: number;
|
|
139
|
+
pressure_angle?: number;
|
|
140
|
+
clearance?: number;
|
|
141
|
+
backlash?: number;
|
|
142
|
+
}
|
|
143
|
+
/** 双曲面齿轮对的构建结果。 */
|
|
144
|
+
export interface HyperbolicGearPairBuild {
|
|
145
|
+
gear1?: BrepHandle;
|
|
146
|
+
gear2?: BrepHandle;
|
|
147
|
+
gear1Geometry: HyperbolicGearGeometry;
|
|
148
|
+
gear2Geometry: HyperbolicGearGeometry;
|
|
149
|
+
/** 轴交角(弧度)。 */
|
|
150
|
+
shaftAngleRad: number;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 构建一对双曲面齿轮(`HyperbolicGearPair`)。
|
|
154
|
+
*
|
|
155
|
+
* 两齿轮的扭转角由轴交角 + 喉部几何反算
|
|
156
|
+
* (`g_twist = 2·asin((w/2)·tan(shaft/2) / r0)`),再各自走 `buildHyperbolicGearSolid`;
|
|
157
|
+
* gear2 用 **throat_r 和** 作 X 向偏移(与 CrossedGearPair 的 r0 和不同)。
|
|
158
|
+
*
|
|
159
|
+
* @throws 扭转角无法计算(NaN,齿数/轴交角/齿宽组合不合法)时抛 Error
|
|
160
|
+
*
|
|
161
|
+
* @param kernel 原始 OCCT 内核
|
|
162
|
+
* @param params 齿轮对参数
|
|
163
|
+
* @param options 构造选项
|
|
164
|
+
* @returns 两件 solid(gear2 默认已定位)与两件几何量
|
|
165
|
+
*/
|
|
166
|
+
export declare function buildHyperbolicGearPair(kernel: GearKernel, params: HyperbolicGearPairParams, options?: BuildCrossedGearPairOptions): HyperbolicGearPairBuild;
|
|
167
|
+
/**
|
|
168
|
+
* 一对双曲面齿轮的导出条目(gear1 → gear2)。
|
|
169
|
+
*
|
|
170
|
+
* @param build 双曲面齿轮对构建结果(gear2 可能为空——只有 `shafts_connected` 时存在)
|
|
171
|
+
* @returns 具名实体数组(名字进 STEP 产品名,供逐件等价比对)
|
|
172
|
+
*/
|
|
173
|
+
export declare function hyperbolicPairExportParts(build: HyperbolicGearPairBuild): Array<{
|
|
174
|
+
name: string;
|
|
175
|
+
solid: BrepHandle;
|
|
176
|
+
}>;
|
|
177
|
+
//# sourceMappingURL=crossed_pair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crossed_pair.d.ts","sourceRoot":"","sources":["../src/crossed_pair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crossed_pair — 交错轴齿轮对(CrossedGearPair / HyperbolicGearPair)
|
|
3
|
+
*
|
|
4
|
+
* 对应 `crossed_helical_gear.py`:两个单体齿轮按轴交角装配成一个 Compound。
|
|
5
|
+
* 两件都各自用现成的实体构造(`buildCrossedHelicalSolid` / `buildHyperbolicGearSolid`),
|
|
6
|
+
* 差异只在**装配定位链**与**螺旋角分配**:
|
|
7
|
+
*
|
|
8
|
+
* ## 螺旋角分配(CrossedGearPair)
|
|
9
|
+
*
|
|
10
|
+
* `gear1_helix_angle is None` 时两齿轮各取 `shaft_angle/2`;否则
|
|
11
|
+
* `g1 = gear1_helix_angle`、`g2 = shaft_angle − gear1_helix_angle`。
|
|
12
|
+
*
|
|
13
|
+
* ## gear2 定位链(两种对类完全一致,仅 X 向偏移不同)
|
|
14
|
+
*
|
|
15
|
+
* Python(右到左复合 `loc = A; loc *= B; loc *= C; loc *= D` ⇒ 施加顺序 D→C→B→A):
|
|
16
|
+
*
|
|
17
|
+
* ```python
|
|
18
|
+
* loc = cq.Location(Vector(r0_1 + r0_2, 0, w1/2)) # A 平移
|
|
19
|
+
* loc *= cq.Location(Vector(0,0,0), X, shaft_angle) # B 绕原点 X 转
|
|
20
|
+
* loc *= cq.Location(Vector(0,0,-w2/2)) # C 平移
|
|
21
|
+
* loc *= cq.Location(Vector(0,0,0), Z, align_angle) # D 绕原点 Z 转
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* `align_angle = (0 if gear2.z%2 else 180/gear2.z) + degrees(gear2.twist + gear1.twist*ratio)/2`,
|
|
25
|
+
* `ratio = gear1.z / gear2.z`。
|
|
26
|
+
*
|
|
27
|
+
* ## X 向偏移差异
|
|
28
|
+
* - CrossedGearPair:用两齿轮分度半径之和 `r0_1 + r0_2`;
|
|
29
|
+
* - HyperbolicGearPair:用两齿轮**喉部半径**之和 `throat_r1 + throat_r2`。
|
|
30
|
+
*/
|
|
31
|
+
import { crossedHelicalGearGeometry, hyperbolicGearGeometry, } from './profile.js';
|
|
32
|
+
import { buildCrossedHelicalSolid } from './crossed_helical_gear.js';
|
|
33
|
+
import { buildHyperbolicGearSolid } from './spur_gear.js';
|
|
34
|
+
const Z_AXIS = { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } };
|
|
35
|
+
const X_AXIS = { point: { x: 0, y: 0, z: 0 }, direction: { x: 1, y: 0, z: 0 } };
|
|
36
|
+
/**
|
|
37
|
+
* 把第二齿轮摆到与第一齿轮啮合的位姿(复刻 Python 的四步 `loc *=`)。
|
|
38
|
+
*
|
|
39
|
+
* 施加顺序 **D → C → B → A**:先绕原点 Z 转 `alignAngle`,再沿 Z 平移 `-w2/2`,
|
|
40
|
+
* 再绕原点 X 转 `shaftAngle`,最后沿 X 平移 `offsetX`、沿 Z 平移 `w1/2`。
|
|
41
|
+
*
|
|
42
|
+
* @param kernel 原始 OCCT 内核
|
|
43
|
+
* @param g2 第二齿轮 solid
|
|
44
|
+
* @param place 定位链输入量
|
|
45
|
+
* @returns 定位后的第二齿轮 solid
|
|
46
|
+
*/
|
|
47
|
+
export function placeSecondGear(kernel, g2, place) {
|
|
48
|
+
let s = g2;
|
|
49
|
+
s = kernel.rotate(s, Z_AXIS, place.alignAngleRad); // D
|
|
50
|
+
s = kernel.translate(s, 0, 0, -place.gear2Width / 2); // C
|
|
51
|
+
s = kernel.rotate(s, X_AXIS, place.shaftAngleRad); // B
|
|
52
|
+
return kernel.translate(s, place.offsetX, 0, place.gear1Width / 2); // A
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 复刻 Python 的 `align_angle` 公式。
|
|
56
|
+
*
|
|
57
|
+
* `align_angle = (0 if gear2.z%2 else 180/gear2.z) + degrees(gear2.twist + gear1.twist*ratio)/2`,
|
|
58
|
+
* `ratio = gear1.z / gear2.z`。两个 twist 都用**弧度**(来自几何量)。
|
|
59
|
+
*
|
|
60
|
+
* @param gear1Z 第一齿轮齿数
|
|
61
|
+
* @param gear1TwistRad 第一齿轮扭转角(弧度)
|
|
62
|
+
* @param gear2Z 第二齿轮齿数
|
|
63
|
+
* @param gear2TwistRad 第二齿轮扭转角(弧度)
|
|
64
|
+
* @returns 对齐角(弧度)
|
|
65
|
+
*/
|
|
66
|
+
export function crossedPairAlignAngle(gear1Z, gear1TwistRad, gear2Z, gear2TwistRad) {
|
|
67
|
+
const ratio = gear1Z / gear2Z;
|
|
68
|
+
// ⚠️ 分支方向与 cq 逐字一致:`align_angle = 0.0 if gear2.z % 2 else 180/gear2.z`。
|
|
69
|
+
// 即 **gear2.z 为偶**时取 `180/gear2.z`(base 非零),**为奇**时取 0。
|
|
70
|
+
// 2026-09-13 修正:此前把奇偶分支写反(偶→0、奇→180/z),导致 gear2 绕 Z 对齐角
|
|
71
|
+
// 差半齿(如 z=20 时差 9°),gear2 被平移+旋转到错误位姿,compare-all 报
|
|
72
|
+
// bool diff ≈ 整件体积(cgp-basic / hgp-basic 因此 DIFFERENT)。
|
|
73
|
+
const alignDeg = (gear2Z % 2 === 0 ? 180 / gear2Z : 0)
|
|
74
|
+
+ (((gear2TwistRad * 180.0) / Math.PI) + ((gear1TwistRad * 180.0) / Math.PI) * ratio) / 2.0;
|
|
75
|
+
return (alignDeg * Math.PI) / 180.0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 构建一对交错轴斜齿轮(`CrossedGearPair`)。
|
|
79
|
+
*
|
|
80
|
+
* 两件都走 `buildCrossedHelicalSolid`(用各自的 helix 角),差异只在参数:gear2 的
|
|
81
|
+
* helix 由 `shaft_angle − gear1_helix` 决定;gear2 默认按轴交角定位到与第一齿轮啮合。
|
|
82
|
+
*
|
|
83
|
+
* @param kernel 原始 OCCT 内核
|
|
84
|
+
* @param params 齿轮对参数
|
|
85
|
+
* @param options 构造选项
|
|
86
|
+
* @returns 两件 solid(gear2 默认已定位)与两件几何量
|
|
87
|
+
*/
|
|
88
|
+
export function buildCrossedGearPair(kernel, params, options = {}) {
|
|
89
|
+
const shaftAngleDeg = params.shaft_angle ?? 90.0;
|
|
90
|
+
let g1Helix;
|
|
91
|
+
let g2Helix;
|
|
92
|
+
if (params.gear1_helix_angle == null) {
|
|
93
|
+
g1Helix = shaftAngleDeg / 2.0;
|
|
94
|
+
g2Helix = shaftAngleDeg / 2.0;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
g1Helix = params.gear1_helix_angle;
|
|
98
|
+
g2Helix = shaftAngleDeg - params.gear1_helix_angle;
|
|
99
|
+
}
|
|
100
|
+
const gear1Params = {
|
|
101
|
+
module: params.module,
|
|
102
|
+
teeth_number: params.gear1_teeth_number,
|
|
103
|
+
width: params.gear1_width,
|
|
104
|
+
pressure_angle: params.pressure_angle,
|
|
105
|
+
helix_angle: g1Helix,
|
|
106
|
+
clearance: params.clearance,
|
|
107
|
+
backlash: params.backlash,
|
|
108
|
+
};
|
|
109
|
+
const gear2Params = {
|
|
110
|
+
module: params.module,
|
|
111
|
+
teeth_number: params.gear2_teeth_number,
|
|
112
|
+
width: params.gear2_width,
|
|
113
|
+
pressure_angle: params.pressure_angle,
|
|
114
|
+
helix_angle: g2Helix,
|
|
115
|
+
clearance: params.clearance,
|
|
116
|
+
backlash: params.backlash,
|
|
117
|
+
};
|
|
118
|
+
const geom1 = crossedHelicalGearGeometry(gear1Params);
|
|
119
|
+
const geom2 = crossedHelicalGearGeometry(gear2Params);
|
|
120
|
+
const shaftAngleRad = (shaftAngleDeg * Math.PI) / 180.0;
|
|
121
|
+
const alignAngleRad = crossedPairAlignAngle(geom1.z, geom1.twistAngle, geom2.z, geom2.twistAngle);
|
|
122
|
+
const out = { gear1Geometry: geom1, gear2Geometry: geom2, shaftAngleRad };
|
|
123
|
+
if (options.buildGear1 !== false) {
|
|
124
|
+
out.gear1 = buildCrossedHelicalSolid(kernel, gear1Params, options);
|
|
125
|
+
}
|
|
126
|
+
if (options.buildGear2 !== false) {
|
|
127
|
+
let g2 = buildCrossedHelicalSolid(kernel, gear2Params, options);
|
|
128
|
+
if (options.transformGear2 !== false) {
|
|
129
|
+
g2 = placeSecondGear(kernel, g2, {
|
|
130
|
+
alignAngleRad,
|
|
131
|
+
shaftAngleRad,
|
|
132
|
+
offsetX: geom1.r0 + geom2.r0,
|
|
133
|
+
gear1Width: params.gear1_width,
|
|
134
|
+
gear2Width: params.gear2_width,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
out.gear2 = g2;
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 一对交错轴斜齿轮的导出条目(gear1 → gear2)。
|
|
143
|
+
*
|
|
144
|
+
* @param build 交叉轴齿轮对构建结果(gear2 可能为空——只有 `shafts_connected` 时存在)
|
|
145
|
+
* @returns 具名实体数组(名字进 STEP 产品名,供逐件等价比对)
|
|
146
|
+
*/
|
|
147
|
+
export function crossedPairExportParts(build) {
|
|
148
|
+
const parts = [];
|
|
149
|
+
if (build.gear1)
|
|
150
|
+
parts.push({ name: 'gear1', solid: build.gear1 });
|
|
151
|
+
if (build.gear2)
|
|
152
|
+
parts.push({ name: 'gear2', solid: build.gear2 });
|
|
153
|
+
return parts;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 构建一对双曲面齿轮(`HyperbolicGearPair`)。
|
|
157
|
+
*
|
|
158
|
+
* 两齿轮的扭转角由轴交角 + 喉部几何反算
|
|
159
|
+
* (`g_twist = 2·asin((w/2)·tan(shaft/2) / r0)`),再各自走 `buildHyperbolicGearSolid`;
|
|
160
|
+
* gear2 用 **throat_r 和** 作 X 向偏移(与 CrossedGearPair 的 r0 和不同)。
|
|
161
|
+
*
|
|
162
|
+
* @throws 扭转角无法计算(NaN,齿数/轴交角/齿宽组合不合法)时抛 Error
|
|
163
|
+
*
|
|
164
|
+
* @param kernel 原始 OCCT 内核
|
|
165
|
+
* @param params 齿轮对参数
|
|
166
|
+
* @param options 构造选项
|
|
167
|
+
* @returns 两件 solid(gear2 默认已定位)与两件几何量
|
|
168
|
+
*/
|
|
169
|
+
export function buildHyperbolicGearPair(kernel, params, options = {}) {
|
|
170
|
+
const shaftAngleDeg = params.shaft_angle;
|
|
171
|
+
const g2Teeth = params.gear2_teeth_number ?? params.gear1_teeth_number;
|
|
172
|
+
const g1R0 = (params.module * params.gear1_teeth_number) / 2.0;
|
|
173
|
+
const g2R0 = (params.module * g2Teeth) / 2.0;
|
|
174
|
+
const alpha = (shaftAngleDeg / 2.0) * (Math.PI / 180.0);
|
|
175
|
+
const hh = (params.width / 2.0) * Math.tan(alpha);
|
|
176
|
+
const g1Twist = 2.0 * Math.asin(hh / g1R0);
|
|
177
|
+
const g2Twist = 2.0 * Math.asin(hh / g2R0);
|
|
178
|
+
if (Number.isNaN(g1Twist) || Number.isNaN(g2Twist)) {
|
|
179
|
+
throw new Error('HyperbolicGearPair: impossible to calculate the twist angle for the '
|
|
180
|
+
+ 'given shaft angle / teeth number / gear width');
|
|
181
|
+
}
|
|
182
|
+
const gear1Params = {
|
|
183
|
+
module: params.module,
|
|
184
|
+
teeth_number: params.gear1_teeth_number,
|
|
185
|
+
width: params.width,
|
|
186
|
+
twist_angle: (g1Twist * 180.0) / Math.PI,
|
|
187
|
+
pressure_angle: params.pressure_angle,
|
|
188
|
+
clearance: params.clearance,
|
|
189
|
+
backlash: params.backlash,
|
|
190
|
+
};
|
|
191
|
+
const gear2Params = {
|
|
192
|
+
module: params.module,
|
|
193
|
+
teeth_number: g2Teeth,
|
|
194
|
+
width: params.width,
|
|
195
|
+
twist_angle: (g2Twist * 180.0) / Math.PI,
|
|
196
|
+
pressure_angle: params.pressure_angle,
|
|
197
|
+
clearance: params.clearance,
|
|
198
|
+
backlash: params.backlash,
|
|
199
|
+
};
|
|
200
|
+
const geom1 = hyperbolicGearGeometry(gear1Params);
|
|
201
|
+
const geom2 = hyperbolicGearGeometry(gear2Params);
|
|
202
|
+
const shaftAngleRad = (shaftAngleDeg * Math.PI) / 180.0;
|
|
203
|
+
const alignAngleRad = crossedPairAlignAngle(geom1.z, geom1.twistAngle, geom2.z, geom2.twistAngle);
|
|
204
|
+
const out = { gear1Geometry: geom1, gear2Geometry: geom2, shaftAngleRad };
|
|
205
|
+
if (options.buildGear1 !== false) {
|
|
206
|
+
out.gear1 = buildHyperbolicGearSolid(kernel, gear1Params, options);
|
|
207
|
+
}
|
|
208
|
+
if (options.buildGear2 !== false) {
|
|
209
|
+
let g2 = buildHyperbolicGearSolid(kernel, gear2Params, options);
|
|
210
|
+
if (options.transformGear2 !== false) {
|
|
211
|
+
g2 = placeSecondGear(kernel, g2, {
|
|
212
|
+
alignAngleRad,
|
|
213
|
+
shaftAngleRad,
|
|
214
|
+
offsetX: geom1.throatR + geom2.throatR,
|
|
215
|
+
gear1Width: params.width,
|
|
216
|
+
gear2Width: params.width,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
out.gear2 = g2;
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 一对双曲面齿轮的导出条目(gear1 → gear2)。
|
|
225
|
+
*
|
|
226
|
+
* @param build 双曲面齿轮对构建结果(gear2 可能为空——只有 `shafts_connected` 时存在)
|
|
227
|
+
* @returns 具名实体数组(名字进 STEP 产品名,供逐件等价比对)
|
|
228
|
+
*/
|
|
229
|
+
export function hyperbolicPairExportParts(build) {
|
|
230
|
+
const parts = [];
|
|
231
|
+
if (build.gear1)
|
|
232
|
+
parts.push({ name: 'gear1', solid: build.gear1 });
|
|
233
|
+
if (build.gear2)
|
|
234
|
+
parts.push({ name: 'gear2', solid: build.gear2 });
|
|
235
|
+
return parts;
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=crossed_pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crossed_pair.js","sourceRoot":"","sources":["../src/crossed_pair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* features — 裸齿轮之上的布尔特征(倒角 / 轴孔 / 凹槽 / 轮毂 / 轮辐)
|
|
3
|
+
*
|
|
4
|
+
* 复刻 cq_gears `GearBase._make_chamfer` / `_make_bore`(A1 尖峰
|
|
5
|
+
* `scripts/spike-chamfer.ts` 已验证:spur 裸体 + chamfer0.5 + bore1 → 体积
|
|
6
|
+
* 167.845620 对齐官方 167.8456187,rel 5.6e-9),以及 SpurGear 系的
|
|
7
|
+
* `_make_recess` / `_make_hub` / `_make_spokes`(RingGear 无这些特征)。
|
|
8
|
+
*
|
|
9
|
+
* 实现要点(与 cq 逐字一致):
|
|
10
|
+
* - 倒角是 XZ 平面(法向 -Y)上的三角轮廓 → line-edge → wire → face → revolve 360°
|
|
11
|
+
* 得到旋转体 cutter,再布尔差到裸齿轮;外部齿 / 内齿(ring)的 cutter 轮廓方向相反。
|
|
12
|
+
* - 轴孔是贯穿圆柱 cut(轴心对齐 +Z,高度 = width + 2E 确保穿透)。
|
|
13
|
+
* - 凹槽(recess)是顶/底面上的圆盘或圆环 pocket 布尔差(cq `cutBlind`,深度恰好
|
|
14
|
+
* = recess,与端面齐平——参考构建同款做法,OCCT 可处理共面 cut)。
|
|
15
|
+
* - 轮毂(hub)是顶面上的圆环棱柱(bore_d 作内孔)布尔并(cq `extrude(hub_length)`)。
|
|
16
|
+
* - 轮辐(spokes)是 r1..r2 之间的「直边 + 内外圆弧」窗口棱柱 cutter,绕 Z 轴
|
|
17
|
+
* 逐个旋转 n_spokes 次布尔差;spoke_fillet 对 cutter 的竖直棱边做圆角。
|
|
18
|
+
*/
|
|
19
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
20
|
+
import type { GearKernel } from '@faicad/cq-compat';
|
|
21
|
+
/** cq `_make_chamfer` 的小偏移量(避免共面自交)。 */
|
|
22
|
+
export declare const CHAMFER_E = 0.01;
|
|
23
|
+
/** 倒角量:标量 = 等边;`[wx, wy]` = 半径方向 / z 方向各自的去除量。 */
|
|
24
|
+
export type ChamferValue = number | [number, number];
|
|
25
|
+
/** 倒角 / 轴孔 / 凹槽 / 轮毂 / 轮辐相关构造选项(裸齿轮之上的镀铬特征)。 */
|
|
26
|
+
export interface GearFeatureOptions {
|
|
27
|
+
/** 上下两边同时倒角(同量)。 */
|
|
28
|
+
chamfer?: ChamferValue;
|
|
29
|
+
/** 顶面倒角量(覆盖 `chamfer`)。 */
|
|
30
|
+
chamferTop?: ChamferValue;
|
|
31
|
+
/** 底面倒角量(覆盖 `chamfer`)。 */
|
|
32
|
+
chamferBottom?: ChamferValue;
|
|
33
|
+
/** 轴孔直径(cq `bore_d`)。 */
|
|
34
|
+
boreD?: number;
|
|
35
|
+
/** 删齿区间集合(cq `missing_teeth`,如 `[[0,10],[20,30]]`)。 */
|
|
36
|
+
missingTeeth?: MissingTeethSpec;
|
|
37
|
+
/** 顶面轮毂直径(cq `hub_d`)。 */
|
|
38
|
+
hubD?: number;
|
|
39
|
+
/** 轮毂自顶面向上的高度(cq `hub_length`,None=不建轮毂)。 */
|
|
40
|
+
hubLength?: number;
|
|
41
|
+
/** 顶面凹槽深度(cq `recess`)。 */
|
|
42
|
+
recess?: number;
|
|
43
|
+
/** 顶面凹槽直径(cq `recess_d`)。 */
|
|
44
|
+
recessD?: number;
|
|
45
|
+
/** 底面凹槽深度(cq `bottom_recess`)。 */
|
|
46
|
+
bottomRecess?: number;
|
|
47
|
+
/** 底面凹槽直径(cq `bottom_recess_d`,缺省用 `recessD`)。 */
|
|
48
|
+
bottomRecessD?: number;
|
|
49
|
+
/** 底面轮毂直径(cq `bottom_hub_d`,缺省用 `hubD`)。 */
|
|
50
|
+
bottomHubD?: number;
|
|
51
|
+
/** 轮辐数量(cq `n_spokes`,>1 才生效)。 */
|
|
52
|
+
nSpokes?: number;
|
|
53
|
+
/** 轮辐宽度(cq `spoke_width`)。 */
|
|
54
|
+
spokeWidth?: number;
|
|
55
|
+
/** 轮辐内径(cq `spokes_id`,缺省 = hub_d)。 */
|
|
56
|
+
spokesId?: number;
|
|
57
|
+
/** 轮辐外径(cq `spokes_od`,缺省 = recess_d)。 */
|
|
58
|
+
spokesOd?: number;
|
|
59
|
+
/** 轮辐圆角(cq `spoke_fillet`,对窗口 cutter 竖直棱边)。 */
|
|
60
|
+
spokeFillet?: number;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 生成单个倒角 cutter 旋转体(A1 已验证的几何)。
|
|
64
|
+
*
|
|
65
|
+
* 轮廓取自 {@link chamferProfile},绕全局 Z 转 360° 成体,供 `applyChamfer` 布尔差。
|
|
66
|
+
*
|
|
67
|
+
* @param kernel 原始 OCCT 内核
|
|
68
|
+
* @param ra 齿顶圆半径(外部齿=齿尖、内齿=内齿尖)
|
|
69
|
+
* @param width 齿宽
|
|
70
|
+
* @param wx 沿半径方向的去除量
|
|
71
|
+
* @param wy 沿 z 方向的去除量
|
|
72
|
+
* @param which 顶面 / 底面(决定用哪一支轮廓)
|
|
73
|
+
* @param isRing 内齿(true)使用与 cq `ring_gear.py` 一致的相反轮廓
|
|
74
|
+
* @returns 绕 Z 轴 360° 回转得到的 cutter 实体句柄
|
|
75
|
+
*/
|
|
76
|
+
export declare function makeChamferCutter(kernel: GearKernel, ra: number, width: number, wx: number, wy: number, which: 'top' | 'bottom', isRing: boolean): BrepHandle;
|
|
77
|
+
/**
|
|
78
|
+
* 复刻 cq `_make_chamfer`:在裸齿轮实体上布尔差上/下倒角旋转体。
|
|
79
|
+
*
|
|
80
|
+
* @param kernel 原始 OCCT 内核
|
|
81
|
+
* @param body 裸齿轮 solid
|
|
82
|
+
* @param ra 齿顶圆半径
|
|
83
|
+
* @param width 齿宽
|
|
84
|
+
* @param opts 倒角选项(chamfer / chamferTop / chamferBottom)
|
|
85
|
+
* @param isRing 内齿(使用 ring 版 cutter 轮廓)
|
|
86
|
+
* @returns 倒角后的 solid(cutter 无效时显式抛错,不静默吞掉)
|
|
87
|
+
*/
|
|
88
|
+
export declare function applyChamfer(kernel: GearKernel, body: BrepHandle, ra: number, width: number, opts: GearFeatureOptions, isRing?: boolean): BrepHandle;
|
|
89
|
+
/**
|
|
90
|
+
* 复刻 cq `_make_bore`:贯穿圆柱 cut(轴心对齐 +Z,高度 = width + 2E 确保穿透)。
|
|
91
|
+
*
|
|
92
|
+
* @param kernel 原始 OCCT 内核
|
|
93
|
+
* @param body 实体
|
|
94
|
+
* @param boreD 轴孔直径(cq `bore_d`)
|
|
95
|
+
* @param width 齿宽
|
|
96
|
+
* @returns 带轴孔的 solid
|
|
97
|
+
*/
|
|
98
|
+
export declare function applyBore(kernel: GearKernel, body: BrepHandle, boreD: number, width: number): BrepHandle;
|
|
99
|
+
/**
|
|
100
|
+
* 复刻 cq `_make_recess`:顶/底面上的圆盘或圆环 pocket 布尔差。
|
|
101
|
+
*
|
|
102
|
+
* cq 语义(逐字对齐 `spur_gear.py::_make_recess`):
|
|
103
|
+
* - 仅在传了 `recess`/`bottom_recess` 深度时生效;`recess_d` 缺失应报错(assert)。
|
|
104
|
+
* - 顶面:外径 = recess_d 的圆盘 pocket,深度恰好 = recess(cutBlind(-recess));
|
|
105
|
+
* 有 hub_d 时改为**圆环** pocket(外 recess_d、内 hub_d)——轮毂在 recess 之后
|
|
106
|
+
* 由 `_make_hub` 另行 fuse,故这里挖掉的只是轮毂之外的环槽。
|
|
107
|
+
* - 底面:bottom_recess_d / bottom_hub_d 缺省时分别回退 recess_d / hub_d。
|
|
108
|
+
* - 深度与端面齐平(cutter 顶面在 z=width / z=0),与参考构建一致,共面 cut OCCT 可处理。
|
|
109
|
+
*
|
|
110
|
+
* @param kernel 原始 OCCT 内核
|
|
111
|
+
* @param body 实体(裸齿轮,含 bore 之后的形态)
|
|
112
|
+
* @param width 齿宽
|
|
113
|
+
* @param opts recess / recessD / hubD / bottomRecess / bottomRecessD / bottomHubD
|
|
114
|
+
* @returns 挖槽后的 solid
|
|
115
|
+
*/
|
|
116
|
+
export declare function applyRecess(kernel: GearKernel, body: BrepHandle, width: number, opts: GearFeatureOptions): BrepHandle;
|
|
117
|
+
/**
|
|
118
|
+
* 复刻 cq `_make_hub`:顶面上的圆环棱柱布尔并(hub_length 为 None 时不建模)。
|
|
119
|
+
*
|
|
120
|
+
* cq 语义(`spur_gear.py::_make_hub`):在顶面 workplane 上,有 bore_d 时先画
|
|
121
|
+
* 内孔圆,再画 hub_d/2 外圆并 `extrude(hub_length)`——得到的是**圆环**棱柱
|
|
122
|
+
* (bore 贯穿轮毂),fuse 到主体上。
|
|
123
|
+
*
|
|
124
|
+
* @param kernel 原始 OCCT 内核
|
|
125
|
+
* @param body 实体
|
|
126
|
+
* @param width 齿宽(轮毂从 z=width 向上生长)
|
|
127
|
+
* @param opts hubD / hubLength / boreD
|
|
128
|
+
* @returns fuse 轮毂后的 solid
|
|
129
|
+
*/
|
|
130
|
+
export declare function applyHub(kernel: GearKernel, body: BrepHandle, width: number, opts: GearFeatureOptions): BrepHandle;
|
|
131
|
+
/**
|
|
132
|
+
* 复刻 cq `_make_spokes`:r1..r2 之间的「直边 + 内外圆弧」窗口棱柱 cutter,
|
|
133
|
+
* 绕 Z 轴逐个旋转 n_spokes 次布尔差(n_spokes 为 None 时不建模)。
|
|
134
|
+
*
|
|
135
|
+
* cq 语义(`spur_gear.py::_make_spokes`,角度逐字一致):
|
|
136
|
+
* - r1 = max(spoke_width/2, spokes_id/2)(spokes_id 缺省 = hub_d)、r2 = spokes_od/2;
|
|
137
|
+
* - 两端各收/放 ±0.0001 避免与内/外边界共面;
|
|
138
|
+
* - a1 = asin(sw/2 / id/2)、a2 = asin(sw/2 / od/2),a3 = tau − a2、a4 = tau − a1;
|
|
139
|
+
* - 窗口轮廓 = 内弧(a1→a4, r1) − 直边(r1@a4 → r2@a3) − 外弧(r2: a3→a2, **顺时针**) −
|
|
140
|
+
* 直边(r2@a2 → r1@a1),即外弧反向走;
|
|
141
|
+
* - 高度 = width + 1.0,从 z=-0.1 起完全穿透;spoke_fillet 对窗口的竖直棱边做圆角。
|
|
142
|
+
*
|
|
143
|
+
* 圆弧用 `makeArcEdge(start, mid, end)` 构造(三点定弧,几何精确,无 radiusArc
|
|
144
|
+
* 的正负半径歧义):外弧 a3→a2 取中点角 (a3+a2)/2。
|
|
145
|
+
*
|
|
146
|
+
* @param kernel 原始 OCCT 内核
|
|
147
|
+
* @param body 实体
|
|
148
|
+
* @param width 齿宽
|
|
149
|
+
* @param opts nSpokes / spokeWidth / spokesId / spokesOd / spokeFillet / hubD / recessD
|
|
150
|
+
* @returns 挖去全部轮辐窗口后的 solid
|
|
151
|
+
*/
|
|
152
|
+
export declare function applySpokes(kernel: GearKernel, body: BrepHandle, width: number, opts: GearFeatureOptions): BrepHandle;
|
|
153
|
+
/** cq `_make_missing_teeth` 的删齿区间集合:`[[起始齿, 结束齿], …]`(含两端)。 */
|
|
154
|
+
export type MissingTeethSpec = Array<[number, number]>;
|
|
155
|
+
/** applyMissingTeeth 所需的齿轮几何量(避免对 profile 的类型耦合)。 */
|
|
156
|
+
export interface MissingTeethGeom {
|
|
157
|
+
/** 齿顶圆半径 */
|
|
158
|
+
ra: number;
|
|
159
|
+
/** 齿根圆半径 */
|
|
160
|
+
rd: number;
|
|
161
|
+
/** 齿距角 2π/z */
|
|
162
|
+
tau: number;
|
|
163
|
+
/** 齿宽 */
|
|
164
|
+
width: number;
|
|
165
|
+
/** 扭转角(弧度,helix_angle=0 时为 0) */
|
|
166
|
+
twistAngle: number;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 复刻 cq `_make_missing_teeth` / `_remove_teeth`:按删齿区间切掉轮齿。
|
|
170
|
+
*
|
|
171
|
+
* cq 语义(`spur_gear.py`,逐字一致):
|
|
172
|
+
* - 每个区间 (t1, t2) 生成窗口 cutter(z=-0.1 起、高 width+0.2 完全穿透),逐个 cut;
|
|
173
|
+
* - twist_angle = 0(直齿):截面 `extrude` 直棱柱;
|
|
174
|
+
* - twist_angle ≠ 0(斜齿/人字齿):截面 `twistExtrude(width+0.2, degrees(-twist))`,
|
|
175
|
+
* 本实现用多站旋转截面 loft 逼近(见 `twistCutoutSolid`)。
|
|
176
|
+
*
|
|
177
|
+
* @param kernel 原始 OCCT 内核
|
|
178
|
+
* @param body 实体(cq `_build` 中位于 bore 之后、recess 之前)
|
|
179
|
+
* @param geom 删齿所需几何量(ra/rd/tau/width/twistAngle)
|
|
180
|
+
* @param spec 删齿区间集合
|
|
181
|
+
* @returns 删齿后的 solid
|
|
182
|
+
*/
|
|
183
|
+
export declare function applyMissingTeeth(kernel: GearKernel, body: BrepHandle, geom: MissingTeethGeom, spec: MissingTeethSpec): BrepHandle;
|
|
184
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"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"}
|