@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.
- package/dist/bearing.d.ts +81 -0
- package/dist/bearing.d.ts.map +1 -0
- package/dist/bearing.js +462 -0
- package/dist/bearing.js.map +1 -0
- package/dist/chain.d.ts +96 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +322 -0
- package/dist/chain.js.map +1 -0
- package/dist/contract.d.ts +9 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +10 -0
- package/dist/contract.js.map +1 -0
- package/dist/data/brad_tee_nut_parameters.json +29 -0
- package/dist/data/button_head_parameters.json +82 -0
- package/dist/data/button_head_with_collar_parameters.json +98 -0
- package/dist/data/chamfered_washer_parameters.json +262 -0
- package/dist/data/cheese_head_parameters.json +182 -0
- package/dist/data/cheese_head_washer_parameters.json +112 -0
- package/dist/data/clearance_hole_sizes.json +427 -0
- package/dist/data/countersunk_head_parameters.json +1752 -0
- package/dist/data/domed_cap_nut_parameters.json +62 -0
- package/dist/data/drill_sizes.json +320 -0
- package/dist/data/heatset_nut_parameters.json +354 -0
- package/dist/data/hex_head_parameters.json +408 -0
- package/dist/data/hex_head_with_flange_parameters.json +114 -0
- package/dist/data/hex_nut_parameters.json +250 -0
- package/dist/data/hex_nut_with_flange_parameters.json +92 -0
- package/dist/data/imperial_set_screw_parameters.json +150 -0
- package/dist/data/iso10664def.json +82 -0
- package/dist/data/metric_set_screw_parameters.json +50 -0
- package/dist/data/nominal_screw_lengths.json +106 -0
- package/dist/data/pan_head_parameters.json +322 -0
- package/dist/data/pan_head_with_collar_parameters.json +56 -0
- package/dist/data/plain_washer_parameters.json +464 -0
- package/dist/data/raised_cheese_head_parameters.json +82 -0
- package/dist/data/raised_countersunk_oval_head_parameters.json +314 -0
- package/dist/data/setscrew_parameters.json +110 -0
- package/dist/data/single_row_angular_contact_ball_bearing_parameters.json +209 -0
- package/dist/data/single_row_capped_deep_groove_ball_bearing_parameters.json +527 -0
- package/dist/data/single_row_cylindrical_roller_bearing_parameters.json +227 -0
- package/dist/data/single_row_deep_groove_ball_bearing_parameters.json +653 -0
- package/dist/data/single_row_tapered_roller_bearing_parameters.json +756 -0
- package/dist/data/socket_head_cap_parameters.json +856 -0
- package/dist/data/square_nut_parameters.json +26 -0
- package/dist/data/tap_hole_sizes.json +398 -0
- package/dist/data/tapered-fillet-drop.json +109 -0
- package/dist/data/unchamfered_hex_nut_parameters.json +42 -0
- package/dist/holes.d.ts +186 -0
- package/dist/holes.d.ts.map +1 -0
- package/dist/holes.js +197 -0
- package/dist/holes.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +117 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +25 -0
- package/dist/kernel.js.map +1 -0
- package/dist/measure.d.ts +52 -0
- package/dist/measure.d.ts.map +1 -0
- package/dist/measure.js +158 -0
- package/dist/measure.js.map +1 -0
- package/dist/nut.d.ts +315 -0
- package/dist/nut.d.ts.map +1 -0
- package/dist/nut.js +700 -0
- package/dist/nut.js.map +1 -0
- package/dist/params.d.ts +178 -0
- package/dist/params.d.ts.map +1 -0
- package/dist/params.js +330 -0
- package/dist/params.js.map +1 -0
- package/dist/primitives.d.ts +440 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +597 -0
- package/dist/primitives.js.map +1 -0
- package/dist/recess.d.ts +129 -0
- package/dist/recess.d.ts.map +1 -0
- package/dist/recess.js +323 -0
- package/dist/recess.js.map +1 -0
- package/dist/screw.d.ts +101 -0
- package/dist/screw.d.ts.map +1 -0
- package/dist/screw.js +945 -0
- package/dist/screw.js.map +1 -0
- package/dist/sprocket.d.ts +135 -0
- package/dist/sprocket.d.ts.map +1 -0
- package/dist/sprocket.js +261 -0
- package/dist/sprocket.js.map +1 -0
- package/dist/test-setup.d.ts +11 -0
- package/dist/test-setup.d.ts.map +1 -0
- package/dist/test-setup.js +30 -0
- package/dist/test-setup.js.map +1 -0
- package/dist/thread.d.ts +189 -0
- package/dist/thread.d.ts.map +1 -0
- package/dist/thread.js +501 -0
- package/dist/thread.js.map +1 -0
- package/dist/washer.d.ts +126 -0
- package/dist/washer.d.ts.map +1 -0
- package/dist/washer.js +204 -0
- package/dist/washer.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure.ts — string measure parsing, mirroring cq_warehouse/thread.py
|
|
3
|
+
* (`is_safe` / `imperial_str_to_float` / `metric_str_to_float`).
|
|
4
|
+
*
|
|
5
|
+
* 红线(方案 §5.3):运行期零 eval —— 所有算术由受限的递归下降求值器完成。
|
|
6
|
+
* 白名单与 thread.py:43 `is_safe` 逐字一致:数字、`.`、`/` 与空格(长度 ≤10),
|
|
7
|
+
* 求值器本身支持 `+ - * / ( )`;英制路径先把空格换成 `+` 再交给求值器,
|
|
8
|
+
* 复刻上游 `eval(measure.strip().replace(" ", "+"))`。
|
|
9
|
+
* 单位约定与上游一致:mm = 1,inch = 25.4 mm(imperial 求值结果 ×25.4)。
|
|
10
|
+
*/
|
|
11
|
+
export declare const INCH = 25.4;
|
|
12
|
+
/**
|
|
13
|
+
* thread.py `is_safe` — 单元格是否可直接交给算术求值器:长度 ≤10 且字符全在
|
|
14
|
+
* 白名单内(数字、`.`、`/` 与空格)。
|
|
15
|
+
* @param value - 待检的单元格文本。
|
|
16
|
+
* @returns true 表示安全可求值。
|
|
17
|
+
*/
|
|
18
|
+
export declare function isSafe(value: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Restricted recursive-descent evaluator: `+ - * / ( )` over number literals.
|
|
21
|
+
* @param expr - 算术表达式(调用方须先过 {@link isSafe})。
|
|
22
|
+
* @returns 求值结果。
|
|
23
|
+
*/
|
|
24
|
+
export declare function evalArithmetic(expr: string): number;
|
|
25
|
+
/**
|
|
26
|
+
* thread.py `metric_str_to_float` — metric values eval raw (mm).
|
|
27
|
+
* Non-eval-able cells are returned as-is (mirrors upstream returning the string).
|
|
28
|
+
* The empty string is passed through: upstream never evaluates it because
|
|
29
|
+
* `isolate_fastener_type` (fastener.py:148) drops empty cells first; gen-data
|
|
30
|
+
* evaluates every cell, so '' must be preserved, not fed to the evaluator.
|
|
31
|
+
* @param measure - 单元格原文(公制,mm)。
|
|
32
|
+
* @returns 求值后的 mm 数值;不可求值或空串时原样返回字符串。
|
|
33
|
+
*/
|
|
34
|
+
export declare function metricStrToFloat(measure: string): number | string;
|
|
35
|
+
/**
|
|
36
|
+
* thread.py `imperial_str_to_float` — spaces become `+` (`"1 1/2"` → `1+1/2`),
|
|
37
|
+
* result converted to mm (×25.4). Non-eval-able cells are returned as-is.
|
|
38
|
+
* Empty string passes through (see metricStrToFloat).
|
|
39
|
+
* @param measure - 单元格原文(英制,含 `1 1/2` 这类分数写法)。
|
|
40
|
+
* @returns 换算为 mm 的数值;不可求值或空串时原样返回字符串。
|
|
41
|
+
*/
|
|
42
|
+
export declare function imperialStrToFloat(measure: string): number | string;
|
|
43
|
+
/**
|
|
44
|
+
* Unified per-cell evaluation used by the parameter tables
|
|
45
|
+
* (fastener.py `evaluate_parameter_dict`): `is_metric` is decided per row
|
|
46
|
+
* by the first character of the row key (`M…` → metric).
|
|
47
|
+
* @param value - 单元格原文。
|
|
48
|
+
* @param isMetric - 该行是否为公制(由行键首字符判定)。
|
|
49
|
+
* @returns 求值结果;不可求值时原样返回字符串。
|
|
50
|
+
*/
|
|
51
|
+
export declare function evaluateCell(value: string, isMetric: boolean): number | string;
|
|
52
|
+
//# sourceMappingURL=measure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,IAAI,OAAO,CAAA;AAKxB;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C;AAqCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyDnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAIjE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAInE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,MAAM,GAAG,MAAM,CAEjB"}
|
package/dist/measure.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* measure.ts — string measure parsing, mirroring cq_warehouse/thread.py
|
|
3
|
+
* (`is_safe` / `imperial_str_to_float` / `metric_str_to_float`).
|
|
4
|
+
*
|
|
5
|
+
* 红线(方案 §5.3):运行期零 eval —— 所有算术由受限的递归下降求值器完成。
|
|
6
|
+
* 白名单与 thread.py:43 `is_safe` 逐字一致:数字、`.`、`/` 与空格(长度 ≤10),
|
|
7
|
+
* 求值器本身支持 `+ - * / ( )`;英制路径先把空格换成 `+` 再交给求值器,
|
|
8
|
+
* 复刻上游 `eval(measure.strip().replace(" ", "+"))`。
|
|
9
|
+
* 单位约定与上游一致:mm = 1,inch = 25.4 mm(imperial 求值结果 ×25.4)。
|
|
10
|
+
*/
|
|
11
|
+
export const INCH = 25.4;
|
|
12
|
+
/** Python thread.py:43 `is_safe` — characters allowed in an eval-able measure. */
|
|
13
|
+
const SAFE_CHARS = new Set('0123456789./ '.split(''));
|
|
14
|
+
/**
|
|
15
|
+
* thread.py `is_safe` — 单元格是否可直接交给算术求值器:长度 ≤10 且字符全在
|
|
16
|
+
* 白名单内(数字、`.`、`/` 与空格)。
|
|
17
|
+
* @param value - 待检的单元格文本。
|
|
18
|
+
* @returns true 表示安全可求值。
|
|
19
|
+
*/
|
|
20
|
+
export function isSafe(value) {
|
|
21
|
+
return value.length <= 10 && [...value].every((c) => SAFE_CHARS.has(c));
|
|
22
|
+
}
|
|
23
|
+
function tokenize(src) {
|
|
24
|
+
const tokens = [];
|
|
25
|
+
let i = 0;
|
|
26
|
+
while (i < src.length) {
|
|
27
|
+
const c = src[i];
|
|
28
|
+
if (c === ' ') {
|
|
29
|
+
i++;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if ((c >= '0' && c <= '9') || c === '.') {
|
|
33
|
+
let j = i;
|
|
34
|
+
while (j < src.length &&
|
|
35
|
+
((src[j] >= '0' && src[j] <= '9') || src[j] === '.'))
|
|
36
|
+
j++;
|
|
37
|
+
const num = Number(src.slice(i, j));
|
|
38
|
+
if (!Number.isFinite(num))
|
|
39
|
+
throw new Error(`invalid number literal in measure: ${JSON.stringify(src)}`);
|
|
40
|
+
tokens.push({ kind: 'num', value: num });
|
|
41
|
+
i = j;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if ('+-*/()'.includes(c)) {
|
|
45
|
+
tokens.push({ kind: 'op', value: c });
|
|
46
|
+
i++;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
throw new Error(`illegal character ${JSON.stringify(c)} in measure: ${JSON.stringify(src)}`);
|
|
50
|
+
}
|
|
51
|
+
return tokens;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Restricted recursive-descent evaluator: `+ - * / ( )` over number literals.
|
|
55
|
+
* @param expr - 算术表达式(调用方须先过 {@link isSafe})。
|
|
56
|
+
* @returns 求值结果。
|
|
57
|
+
*/
|
|
58
|
+
export function evalArithmetic(expr) {
|
|
59
|
+
const tokens = tokenize(expr);
|
|
60
|
+
let pos = 0;
|
|
61
|
+
const peek = () => tokens[pos];
|
|
62
|
+
const parseExpr = () => {
|
|
63
|
+
let left = parseTerm();
|
|
64
|
+
for (;;) {
|
|
65
|
+
const t = peek();
|
|
66
|
+
if (t && t.kind === 'op' && (t.value === '+' || t.value === '-')) {
|
|
67
|
+
pos++;
|
|
68
|
+
left = t.value === '+' ? left + parseTerm() : left - parseTerm();
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
return left;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const parseTerm = () => {
|
|
76
|
+
let left = parseFactor();
|
|
77
|
+
for (;;) {
|
|
78
|
+
const t = peek();
|
|
79
|
+
if (t && t.kind === 'op' && (t.value === '*' || t.value === '/')) {
|
|
80
|
+
pos++;
|
|
81
|
+
left = t.value === '*' ? left * parseFactor() : left / parseFactor();
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
return left;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const parseFactor = () => {
|
|
89
|
+
const t = peek();
|
|
90
|
+
if (!t)
|
|
91
|
+
throw new Error(`unexpected end of measure: ${JSON.stringify(expr)}`);
|
|
92
|
+
if (t.kind === 'op' && (t.value === '+' || t.value === '-')) {
|
|
93
|
+
pos++;
|
|
94
|
+
const v = parseFactor();
|
|
95
|
+
return t.value === '+' ? v : -v;
|
|
96
|
+
}
|
|
97
|
+
if (t.kind === 'op' && t.value === '(') {
|
|
98
|
+
pos++;
|
|
99
|
+
const v = parseExpr();
|
|
100
|
+
const close = peek();
|
|
101
|
+
if (!close || close.kind !== 'op' || close.value !== ')')
|
|
102
|
+
throw new Error(`missing ')' in measure: ${JSON.stringify(expr)}`);
|
|
103
|
+
pos++;
|
|
104
|
+
return v;
|
|
105
|
+
}
|
|
106
|
+
if (t.kind === 'num') {
|
|
107
|
+
pos++;
|
|
108
|
+
return t.value;
|
|
109
|
+
}
|
|
110
|
+
throw new Error(`unexpected token in measure: ${JSON.stringify(expr)}`);
|
|
111
|
+
};
|
|
112
|
+
const value = parseExpr();
|
|
113
|
+
if (pos !== tokens.length)
|
|
114
|
+
throw new Error(`trailing tokens in measure: ${JSON.stringify(expr)}`);
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* thread.py `metric_str_to_float` — metric values eval raw (mm).
|
|
119
|
+
* Non-eval-able cells are returned as-is (mirrors upstream returning the string).
|
|
120
|
+
* The empty string is passed through: upstream never evaluates it because
|
|
121
|
+
* `isolate_fastener_type` (fastener.py:148) drops empty cells first; gen-data
|
|
122
|
+
* evaluates every cell, so '' must be preserved, not fed to the evaluator.
|
|
123
|
+
* @param measure - 单元格原文(公制,mm)。
|
|
124
|
+
* @returns 求值后的 mm 数值;不可求值或空串时原样返回字符串。
|
|
125
|
+
*/
|
|
126
|
+
export function metricStrToFloat(measure) {
|
|
127
|
+
if (measure === '')
|
|
128
|
+
return '';
|
|
129
|
+
if (isSafe(measure))
|
|
130
|
+
return evalArithmetic(measure);
|
|
131
|
+
return measure;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* thread.py `imperial_str_to_float` — spaces become `+` (`"1 1/2"` → `1+1/2`),
|
|
135
|
+
* result converted to mm (×25.4). Non-eval-able cells are returned as-is.
|
|
136
|
+
* Empty string passes through (see metricStrToFloat).
|
|
137
|
+
* @param measure - 单元格原文(英制,含 `1 1/2` 这类分数写法)。
|
|
138
|
+
* @returns 换算为 mm 的数值;不可求值或空串时原样返回字符串。
|
|
139
|
+
*/
|
|
140
|
+
export function imperialStrToFloat(measure) {
|
|
141
|
+
if (measure === '')
|
|
142
|
+
return '';
|
|
143
|
+
if (isSafe(measure))
|
|
144
|
+
return evalArithmetic(measure.trim().replace(/ /g, '+')) * INCH;
|
|
145
|
+
return measure;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Unified per-cell evaluation used by the parameter tables
|
|
149
|
+
* (fastener.py `evaluate_parameter_dict`): `is_metric` is decided per row
|
|
150
|
+
* by the first character of the row key (`M…` → metric).
|
|
151
|
+
* @param value - 单元格原文。
|
|
152
|
+
* @param isMetric - 该行是否为公制(由行键首字符判定)。
|
|
153
|
+
* @returns 求值结果;不可求值时原样返回字符串。
|
|
154
|
+
*/
|
|
155
|
+
export function evaluateCell(value, isMetric) {
|
|
156
|
+
return isMetric ? metricStrToFloat(value) : imperialStrToFloat(value);
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.js","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"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"}
|
package/dist/nut.d.ts
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* nut.ts — 螺母七类移植(上游 `cq_warehouse/fastener.py:365-1240`,方案 §8 W4)。
|
|
3
|
+
*
|
|
4
|
+
* 类映射(方案 §4.2):`Nut` 基类 → {@link buildNut};具体类 → `hexNut()` /
|
|
5
|
+
* `hexNutWithFlange()` / `unchamferedHexagonNut()` / `squareNut()` / `domedCapNut()` /
|
|
6
|
+
* `bradTeeNut()` / `heatSetNut()`;轮廓与 plan → `nutProfile()` / `nutPlanWire()`
|
|
7
|
+
* (纯几何,不建 kernel 对象,便于单测与复用)。
|
|
8
|
+
*
|
|
9
|
+
* ## `make_nut` 的四步映射(fastener.py:581-635)
|
|
10
|
+
*
|
|
11
|
+
* | 上游 | 本包 |
|
|
12
|
+
* |---|---|
|
|
13
|
+
* | `nut_profile().toPending().revolve()` | 轮廓段列 → wire → {@link primitives.revolveProfile} |
|
|
14
|
+
* | `Workplane("XY").add(nut_plan()).toPending().extrude(max_nut_height)` | plan wire → {@link primitives.planarFace} → {@link primitives.extrudeFace} |
|
|
15
|
+
* | `.faces("<Z").workplane().hole(d, depth)` | {@link primitives.cylinderBetween} 后 `cut` |
|
|
16
|
+
* | `nut.intersect(blank)` / `.union(flange)` / `.union(thread)` | `intersect` / `fuse` |
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ **plan 必须先成 face 再拉伸**:probe 实测(`scripts/kernel-nut-probe.ts` 段 1)
|
|
19
|
+
* `extrude(wire,0,0,3)` 对 4×2 矩形给体积 −16(错),传 face 才得 24(对)。内核不校验
|
|
20
|
+
* 输入拓扑——传错不抛错,只静默给错几何。
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ **`max_nut_height` 取轮廓最高顶点 z**(上游 `profile.vertices(">Z").val().Z`),
|
|
23
|
+
* 不是 `nut_data["m"]`:DomedCapNut 的球顶使之为 `m + dk/2`。
|
|
24
|
+
*
|
|
25
|
+
* ## cq 语义的逐条复现(读 cadquery `cq.py` 源码确认,证据见 W4 分析文档)
|
|
26
|
+
*
|
|
27
|
+
* - `polygon(nSides, diameter)`:顶点自角度 **0** 起(首顶点在 `(r, 0)`),半径 = `diameter/2`
|
|
28
|
+
* (`cq.py:2677-2688`)。
|
|
29
|
+
* - `rect(w, h, centered=False)`:轮廓为 `(0,0) → (w,0) → (w,h) → (0,h)`。
|
|
30
|
+
* - `radiusArc(end, radius)` → `sagittaArc`(`cq.py:2154-2188`):`sag = |r| − √(r²−half²)`,
|
|
31
|
+
* 符号随 radius;`sagittaArc` 把 sag 沿**弦法向旋转 ±90°**得第三点(`cq.py:2139-2150`)。
|
|
32
|
+
* - XZ 工作平面的局部 `(u, v)` → 世界 `(u, 0, v)`(局部 x 沿世界 X,局部 y 沿世界 Z)。
|
|
33
|
+
*
|
|
34
|
+
* ## 未实现(W4 内的已知缺口,显式抛错而非静默降级)
|
|
35
|
+
*
|
|
36
|
+
* `HeatSetNut` 的 `make_nut`(fastener.py:947)不走向轮廓旋转,而是
|
|
37
|
+
* `Face.makeNSidedSurface` 造 knurl 面 + `Shell.makeShell` + `Solid.makeSolid`。
|
|
38
|
+
* 本内核无 `makeNSidedSurface`;probe(`scripts/kernel-nut-probe.ts` 段 4)实测
|
|
39
|
+
* `makeNonPlanarFace(4 边扭面 wire)` 退化为 **3 边面**(面积 2.749170),几何不等价
|
|
40
|
+
* ——不构成可接受的替代。详见 `docs/analysis/2026-09-14-cq-warehouse-nut-washer-probe.md`。
|
|
41
|
+
*
|
|
42
|
+
* `BradTeeNut` **已实现**:其 `custom_make` 需要的 `extensions.clearanceHole` 由
|
|
43
|
+
* `src/recess.ts` 的 **W4 临时**等价实现承担(按方案 §8-W4 去重表,W9·P1-b 落地后替换)。
|
|
44
|
+
*/
|
|
45
|
+
import type { BrepHandle, BrepVec3 } from '@faicad/faijs';
|
|
46
|
+
import { type ParamRow, type NutClassName } from './params.js';
|
|
47
|
+
import { type Hand } from './thread.js';
|
|
48
|
+
/** 上游 `Nut.socket_clearance`(fastener.py:554)= 6 mm。 */
|
|
49
|
+
export declare const SOCKET_CLEARANCE = 6;
|
|
50
|
+
/** 轮廓顶点(XZ 平面极坐标形态:`r` = 到轴距离,`z` = 轴向高度)。 */
|
|
51
|
+
export interface NutProfilePoint {
|
|
52
|
+
r: number;
|
|
53
|
+
z: number;
|
|
54
|
+
}
|
|
55
|
+
/** 轮廓的一段(cq `hLineTo`/`vLineTo`/`lineTo` 为直线,`radiusArc` 为圆弧)。 */
|
|
56
|
+
export type NutProfileSegment = {
|
|
57
|
+
kind: 'line';
|
|
58
|
+
to: NutProfilePoint;
|
|
59
|
+
} | {
|
|
60
|
+
kind: 'radiusArc';
|
|
61
|
+
to: NutProfilePoint;
|
|
62
|
+
radius: number;
|
|
63
|
+
};
|
|
64
|
+
/** 闭合轮廓(`start` + 依次到达的段;收尾边由 {@link profileWire} 补)。 */
|
|
65
|
+
export interface NutProfile {
|
|
66
|
+
start: NutProfilePoint;
|
|
67
|
+
segments: NutProfileSegment[];
|
|
68
|
+
}
|
|
69
|
+
/** `Nut.__init__`(fastener.py:520)的入参——参数名逐字沿用上游 snake_case。 */
|
|
70
|
+
export interface NutParams {
|
|
71
|
+
size: string;
|
|
72
|
+
fastener_type: string;
|
|
73
|
+
hand?: Hand;
|
|
74
|
+
simple?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/** `buildNut` 的结果:几何句柄 + 上游同名派生量。 */
|
|
77
|
+
export interface NutResult {
|
|
78
|
+
handle: BrepHandle;
|
|
79
|
+
/** 上游 `nut_class`(`type(self).__name__`)。 */
|
|
80
|
+
nutClass: NutClassName;
|
|
81
|
+
size: string;
|
|
82
|
+
/** 上游 `self.thread_size`(`size` 的前两段以 `-` 连接)。 */
|
|
83
|
+
threadSize: string;
|
|
84
|
+
/** 上游 `self.length_size`(`size` 含第三段时存在,如 HeatSetNut 的 `Standard`)。 */
|
|
85
|
+
lengthSize?: string;
|
|
86
|
+
isMetric: boolean;
|
|
87
|
+
threadDiameter: number;
|
|
88
|
+
threadPitch: number;
|
|
89
|
+
fastenerType: string;
|
|
90
|
+
hand: Hand;
|
|
91
|
+
/** 上游默认 `simple=True`(不建螺纹)。 */
|
|
92
|
+
simple: boolean;
|
|
93
|
+
/** `isolate_fastener_type` 后的该规格行。 */
|
|
94
|
+
nutData: ParamRow;
|
|
95
|
+
/** 上游 `nut_thickness`(最高顶点 z)。 */
|
|
96
|
+
nutThickness: number;
|
|
97
|
+
/** 上游 `nut_diameter`(2 × 最大水平半径)。 */
|
|
98
|
+
nutDiameter: number;
|
|
99
|
+
/** 上游 `info`。 */
|
|
100
|
+
info: string;
|
|
101
|
+
/** 上游 `clearance_hole_diameters`(`size.split("-")[0]` → 配合等级 → mm);缺表为 `{}`。 */
|
|
102
|
+
clearanceHoleDiameters: Record<string, number>;
|
|
103
|
+
/** 上游 `tap_hole_diameters`(完整 `thread_size` → Soft/Hard → mm);缺表为 `{}`。 */
|
|
104
|
+
tapHoleDiameters: Record<string, number>;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* `fastener.py:54 polygon_diagonal` —— 对边距 → 对角(外接圆)直径。
|
|
108
|
+
* @param width - 对边距(正多边形两条平行边之间的距离)。
|
|
109
|
+
* @param numSides - 边数(默认 6,即六角螺母)。
|
|
110
|
+
* @returns 外接圆直径 `width / cos(π / numSides)`。
|
|
111
|
+
*/
|
|
112
|
+
export declare function polygonDiagonal(width: number, numSides?: number): number;
|
|
113
|
+
/**
|
|
114
|
+
* `cq.py:2154-2188 radiusArc` → `sagittaArc` 的弧中点。
|
|
115
|
+
* @param start - 弧起点(轮廓当前点)。
|
|
116
|
+
* @param end - 弧终点。
|
|
117
|
+
* @param radius - 弧半径(正=凸、负=凹,语义同 cq)。
|
|
118
|
+
* @returns 弧上一点(供三点弧 `makeArcEdge`)。
|
|
119
|
+
*/
|
|
120
|
+
export declare function radiusArcMidpoint(start: NutProfilePoint, end: NutProfilePoint, radius: number): NutProfilePoint;
|
|
121
|
+
/**
|
|
122
|
+
* 轮廓的点列(起点 + 各段终点),用于取 `max_nut_height` 等。
|
|
123
|
+
* @param p - 轮廓({@link ProfileBuilder} 链式构造的产物)。
|
|
124
|
+
* @returns 顶点序列,首元素为轮廓起点。
|
|
125
|
+
*/
|
|
126
|
+
export declare function profilePoints(p: NutProfile): NutProfilePoint[];
|
|
127
|
+
/**
|
|
128
|
+
* `Nut.default_nut_profile`(fastener.py:637)—— 六角双倒角轮廓(HexNut / HexNutWithFlange 用)。
|
|
129
|
+
* @param data - 该规格的参数行(含 m/s)。
|
|
130
|
+
* @returns 轮廓(起点在轴上 `(0,0)`)。
|
|
131
|
+
*/
|
|
132
|
+
export declare function defaultNutProfile(data: ParamRow): NutProfile;
|
|
133
|
+
/**
|
|
134
|
+
* `DomedCapNut.nut_profile`(fastener.py:685)—— 六角 + 球顶(含两段 `radiusArc`)。
|
|
135
|
+
*
|
|
136
|
+
* ⚠️ 起点为 `(1, 0)`(上游 `moveTo(1*MM, 0)`)而非轴上:轮廓留下 r∈[0,1] 的内孔,
|
|
137
|
+
* 最终由 `nut_blank` 的螺纹孔覆盖(对 M≥4 无影响)。
|
|
138
|
+
* @param data - 该规格的参数行(含 dk/m/s)。
|
|
139
|
+
* @returns 轮廓。
|
|
140
|
+
*/
|
|
141
|
+
export declare function domedCapNutProfile(data: ParamRow): NutProfile;
|
|
142
|
+
/**
|
|
143
|
+
* `UnchamferedHexagonNut.nut_profile`(fastener.py:1189)—— 无倒角矩形(六角对边距)。
|
|
144
|
+
* @param data - 该规格的参数行(含 m/s)。
|
|
145
|
+
* @returns 轮廓。
|
|
146
|
+
*/
|
|
147
|
+
export declare function unchamferedHexagonNutProfile(data: ParamRow): NutProfile;
|
|
148
|
+
/**
|
|
149
|
+
* `SquareNut.nut_profile`(fastener.py:1211)—— 四方双倒角(`polygon_diagonal(s, 4)`)。
|
|
150
|
+
* @param data - 该规格的参数行(含 m/s)。
|
|
151
|
+
* @returns 轮廓。
|
|
152
|
+
*/
|
|
153
|
+
export declare function squareNutProfile(data: ParamRow): NutProfile;
|
|
154
|
+
/**
|
|
155
|
+
* `BradTeeNut.nut_profile`(fastener.py:751)—— 法兰盘 + 台肩(**相对**位移 `vLine`/`hLine`)。
|
|
156
|
+
* @param data - 该规格的参数行(含 c/dc/m/s)。
|
|
157
|
+
* @returns 轮廓(点序:`(0,0) → (0,m) → (dc/2,m) → (dc/2,m−c) → (s,m−c) → (s,0) → (0,0)`)。
|
|
158
|
+
*/
|
|
159
|
+
export declare function bradTeeNutProfile(data: ParamRow): NutProfile;
|
|
160
|
+
/**
|
|
161
|
+
* `HexNutWithFlange.flange_profile`(fastener.py:1139)—— 25° 过切线 + `radiusArc` + `polarLine`。
|
|
162
|
+
* @param data - 该规格的参数行(含 c/dc)。
|
|
163
|
+
* @returns 轮廓(起点在轴上 `(0,0)`)。
|
|
164
|
+
*/
|
|
165
|
+
export declare function hexNutFlangeProfile(data: ParamRow): NutProfile;
|
|
166
|
+
/**
|
|
167
|
+
* 正多边形顶点(`cq polygon(nSides, diameter)` 等价:首顶点在 `(r, 0)`)。
|
|
168
|
+
* @param diameter - 外接圆直径(mm)。
|
|
169
|
+
* @param nSides - 边数。
|
|
170
|
+
* @returns XY 平面顶点列(z=0)。
|
|
171
|
+
*/
|
|
172
|
+
export declare function polygonPlanPoints(diameter: number, nSides: number): BrepVec3[];
|
|
173
|
+
/**
|
|
174
|
+
* `Nut.default_nut_plan`(fastener.py:659)—— 正六边形。
|
|
175
|
+
* @param data - 该规格的参数行(含 s)。
|
|
176
|
+
* @returns XY 平面六边形 wire。
|
|
177
|
+
*/
|
|
178
|
+
export declare function defaultNutPlanWire(data: ParamRow): BrepHandle;
|
|
179
|
+
/**
|
|
180
|
+
* `SquareNut.nut_plan`(fastener.py:1227)—— 边长 s 的正方形(`rect(s, s)`,居中)。
|
|
181
|
+
* @param data - 该规格的参数行(含 s)。
|
|
182
|
+
* @returns XY 平面正方形 wire。
|
|
183
|
+
*/
|
|
184
|
+
export declare function squareNutPlanWire(data: ParamRow): BrepHandle;
|
|
185
|
+
/**
|
|
186
|
+
* `BradTeeNut.nut_plan`(fastener.py:764)—— 直径 dc 的圆。
|
|
187
|
+
* @param data - 该规格的参数行(含 dc)。
|
|
188
|
+
* @returns XY 平面圆 wire。
|
|
189
|
+
*/
|
|
190
|
+
export declare function bradTeeNutPlanWire(data: ParamRow): BrepHandle;
|
|
191
|
+
/**
|
|
192
|
+
* `Nut.default_countersink_profile`(fastener.py:664)—— 含 `socket_clearance` 的矩形环。
|
|
193
|
+
* @param data - 该规格的参数行(含 m/s)。
|
|
194
|
+
* @returns 切割器轮廓。
|
|
195
|
+
*/
|
|
196
|
+
export declare function defaultNutCountersinkProfile(data: ParamRow): NutProfile;
|
|
197
|
+
/**
|
|
198
|
+
* `SquareNut.countersink_profile`(fastener.py:1231)—— 四方版。
|
|
199
|
+
* @param data - 该规格的参数行(含 m/s)。
|
|
200
|
+
* @returns 切割器轮廓。
|
|
201
|
+
*/
|
|
202
|
+
export declare function squareNutCountersinkProfile(data: ParamRow): NutProfile;
|
|
203
|
+
/**
|
|
204
|
+
* `DomedCapNut.countersink_profile`(fastener.py:707)—— 高度含球顶 `dk/2`。
|
|
205
|
+
* @param data - 该规格的参数行(含 dk/m/s)。
|
|
206
|
+
* @returns 切割器轮廓。
|
|
207
|
+
*/
|
|
208
|
+
export declare function domedCapNutCountersinkProfile(data: ParamRow): NutProfile;
|
|
209
|
+
/**
|
|
210
|
+
* `HexNutWithFlange.countersink_profile`(fastener.py:1157)—— 取 `dc+clearance` 与
|
|
211
|
+
* `socket_clearance` 的较大者。
|
|
212
|
+
* @param data - 该规格的参数行(含 dc/m/s)。
|
|
213
|
+
* @param threadDiameter - 螺纹公称直径(mm)。
|
|
214
|
+
* @param clearanceHoleDiameter - 该配合等级的间隙孔直径(mm)。
|
|
215
|
+
* @returns 切割器轮廓。
|
|
216
|
+
*/
|
|
217
|
+
export declare function hexNutFlangeCountersinkProfile(data: ParamRow, threadDiameter: number, clearanceHoleDiameter: number): NutProfile;
|
|
218
|
+
/**
|
|
219
|
+
* `fastener.py:74 decode_imperial_size` —— 拆英寸规格为 (大径 mm, 螺距 mm)。
|
|
220
|
+
* @param size - 形如 `1/4-20` 或 `#6-32` 的英制规格。
|
|
221
|
+
* @returns `[大径 mm, 螺距 mm]`。
|
|
222
|
+
*/
|
|
223
|
+
export declare function decodeImperialSize(size: string): [number, number];
|
|
224
|
+
/** 标准族的类钩子(profile / plan / 可选法兰)。沉孔轮廓单独导出,不进本钩子。 */
|
|
225
|
+
interface StandardNutHooks {
|
|
226
|
+
profile: (data: ParamRow) => NutProfile;
|
|
227
|
+
planWire: (data: ParamRow) => BrepHandle;
|
|
228
|
+
flangeProfile?: (data: ParamRow) => NutProfile;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* `Nut.__init__` + `make_nut`(fastener.py:520 / :581)的共享实现(标准族)。
|
|
232
|
+
*
|
|
233
|
+
* @param className - 螺母类名(决定参数表与输出标签)。
|
|
234
|
+
* @param hooks - 该类的轮廓 / plan / 法兰钩子。
|
|
235
|
+
* @param p - 入参(`size` / `fastener_type` / `hand` / `simple`)。
|
|
236
|
+
* @returns 螺母实体与上游同名派生量。
|
|
237
|
+
*/
|
|
238
|
+
export declare function buildNut(className: NutClassName, hooks: StandardNutHooks, p: NutParams): NutResult;
|
|
239
|
+
/**
|
|
240
|
+
* `HexNut`(fastener.py:1105)——iso4032 / iso4033 / iso4035。
|
|
241
|
+
* @param p - 入参(`size` 如 `M6-1`;`fastener_type` 如 `iso4032`)。
|
|
242
|
+
* @returns 螺母实体与派生量。
|
|
243
|
+
*/
|
|
244
|
+
export declare function hexNut(p: NutParams): NutResult;
|
|
245
|
+
/**
|
|
246
|
+
* `HexNutWithFlange`(fastener.py:1123)——din1665,带法兰分支。
|
|
247
|
+
* @param p - 入参(`fastener_type` 固定 `din1665`)。
|
|
248
|
+
* @returns 螺母实体与派生量。
|
|
249
|
+
*/
|
|
250
|
+
export declare function hexNutWithFlange(p: NutParams): NutResult;
|
|
251
|
+
/**
|
|
252
|
+
* `UnchamferedHexagonNut`(fastener.py:1176)——iso4036,无倒角。
|
|
253
|
+
* @param p - 入参(`fastener_type` 固定 `iso4036`)。
|
|
254
|
+
* @returns 螺母实体与派生量。
|
|
255
|
+
*/
|
|
256
|
+
export declare function unchamferedHexagonNut(p: NutParams): NutResult;
|
|
257
|
+
/**
|
|
258
|
+
* `SquareNut`(fastener.py:1200)——din557,四方。
|
|
259
|
+
* @param p - 入参(`fastener_type` 固定 `din557`)。
|
|
260
|
+
* @returns 螺母实体与派生量。
|
|
261
|
+
*/
|
|
262
|
+
export declare function squareNut(p: NutParams): NutResult;
|
|
263
|
+
/**
|
|
264
|
+
* `DomedCapNut`(fastener.py:674)——din1587,球顶。
|
|
265
|
+
* @param p - 入参(`fastener_type` 固定 `din1587`)。
|
|
266
|
+
* @returns 螺母实体与派生量。
|
|
267
|
+
*/
|
|
268
|
+
export declare function domedCapNut(p: NutParams): NutResult;
|
|
269
|
+
/**
|
|
270
|
+
* `cq.Workplane.polarArray(radius, startAngle, endAngle, count)`(cadquery `cq.py`)——
|
|
271
|
+
* **只取位置,不建几何**(本包不需要平台的 `polarArray` parity)。
|
|
272
|
+
*
|
|
273
|
+
* cq 的角度分布为 `startAngle + (endAngle − startAngle)·i/count`(`i = 0..count−1`),
|
|
274
|
+
* 即 `endAngle` 是**排他**上界:`(0, 360, 3)` → 0°/120°/240°。
|
|
275
|
+
* @param radius - 阵列半径(mm)。
|
|
276
|
+
* @param startAngleDeg - 起始角(度)。
|
|
277
|
+
* @param endAngleDeg - 结束角(度,排他)。
|
|
278
|
+
* @param count - 个数。
|
|
279
|
+
* @returns `[x, y]` 位置列(z=0)。
|
|
280
|
+
*/
|
|
281
|
+
export declare function polarArrayLocations(radius: number, startAngleDeg: number, endAngleDeg: number, count: number): Array<[number, number]>;
|
|
282
|
+
/**
|
|
283
|
+
* `BradTeeNut.custom_make`(fastener.py:734)—— 大法兰盘 + `brad_num` 个沉头螺钉孔。
|
|
284
|
+
*
|
|
285
|
+
* 上游步骤:`make_nut()` → `faces(">Z").workplane()` → `polarArray(bcd/2, 0, 360, brad_num)`
|
|
286
|
+
* → `clearanceHole(fastener=CounterSunkScrew(brad_size, 2c, "iso10642"))`。
|
|
287
|
+
*
|
|
288
|
+
* 本包把 `clearanceHole` 走 {@link holes.fastenerHoleCutter}(W9·P1-b 正式实现,
|
|
289
|
+
* 原 `recess.ts` 的 W4 临时切割器已删除;沉头轮廓仍用 `tempCounterSunkCountersinkProfile`)。解析验证(`scripts/probe-bradtee-decomposition.py`
|
|
290
|
+
* 出 A 侧中间量;B 侧 STEP 等价由 `src/nut.test.ts` 锁定):
|
|
291
|
+
* - `make_nut()` = 3585.465923(与前剖面/plan 模型解析值一致);
|
|
292
|
+
* - 每孔切除 65.4292(截锥 ∪ 杆部 ∪ 钻尖 在法兰板内的并集),3 孔共 196.290;
|
|
293
|
+
* - 终值 = 3389.175287,与 A 侧 manifest 逐位一致。
|
|
294
|
+
*
|
|
295
|
+
* ⚠️ **不调上游的 `.clean()`**(OCCT `ShapeUpgrade_UnifySameDomain`)——只合同域面、
|
|
296
|
+
* 不改体积;内核无该封装(cq-compat parity 欠账)。见 `src/recess.ts` 文件头。
|
|
297
|
+
* @param p - 入参(`size` / `fastener_type`=`Hilitchi`)。
|
|
298
|
+
* @returns 螺母实体与派生量。
|
|
299
|
+
*/
|
|
300
|
+
export declare function bradTeeNut(p: NutParams): NutResult;
|
|
301
|
+
/**
|
|
302
|
+
* `HeatSetNut`(fastener.py:791)—— McMaster-Carr / Hilitchi 热熔铜螺母。
|
|
303
|
+
*
|
|
304
|
+
* ⚠️ **W4 未实现(显式抛错)**。上游 `make_nut`(fastener.py:947)不走向轮廓旋转,
|
|
305
|
+
* 而是 `Face.makeNSidedSurface` 造 knurl 面 + `Shell.makeShell` + `Solid.makeSolid`。
|
|
306
|
+
* 本内核无 `makeNSidedSurface`;probe(`scripts/kernel-nut-probe.ts` 段 4)实测
|
|
307
|
+
* `makeNonPlanarFace(4 边扭面 wire)` 退化为 **3 边面**(面积 2.749170),几何不等价
|
|
308
|
+
* ——不构成可接受的替代。详见 W4 分析文档。
|
|
309
|
+
* @param p - 入参(`size` 形如 `M3-0.5-Standard`)。
|
|
310
|
+
* @throws 总是抛出,说明缺失内核能力。
|
|
311
|
+
* @returns 永不返回(抛错)。
|
|
312
|
+
*/
|
|
313
|
+
export declare function heatSetNut(p: NutParams): NutResult;
|
|
314
|
+
export {};
|
|
315
|
+
//# sourceMappingURL=nut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nut.d.ts","sourceRoot":"","sources":["../src/nut.ts"],"names":[],"mappings":"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"}
|