@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
package/dist/recess.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recess.ts — W5 螺钉沉孔切割器(方案 §5.4 W5 交付物)。
|
|
3
|
+
*
|
|
4
|
+
* ≈ 上游 `fastener.py:226-347` 的五种沉孔 plan + `default_head_recess`
|
|
5
|
+
* (fastener.py:1576)的 plan/depth/taper 三元组,以及 `make_head`
|
|
6
|
+
* (fastener.py:1513)里的切割器构造:
|
|
7
|
+
*
|
|
8
|
+
* cutter = extrudeLinear(plan, (0,0,-depth), taper).translate((0,0,topZ))
|
|
9
|
+
* head_blank = plan Extrude(topZ) − cutter
|
|
10
|
+
* head = revolved_profile ∩ head_blank
|
|
11
|
+
*
|
|
12
|
+
* B 侧等价替换(探针 §W5-probe11/12 实证,体积解析对齐):
|
|
13
|
+
* draftPrism 只能沿 +dz 收缩远端,与上游「从顶面向下收」的切割器方向相反——
|
|
14
|
+
* 先向上拔模拉伸(远端收缩)、再关于 XY 面镜像、平移到头顶,三步合成。
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ W5 已知缺口(红线:未验证的路径必须显式抛错,禁止静默近似):
|
|
17
|
+
* taper=30° 的截面随深度收缩,臂宽(PH: m/12,R: m/2)在深度
|
|
18
|
+
* h* = (m/12)/tan30° ≈ 0.76·m/12… 内归零,之后 A 侧 LocOpe_DPrism 靠
|
|
19
|
+
* 「截面自交后续生锥面」继续成型(实测 PH2 切割器 z 底 −2.349、含 4 锥面),
|
|
20
|
+
* 本内核 draftPrism 在自交前即抛错(探针 §W5-probe50:深 0.8 即失败)。
|
|
21
|
+
* → cross(PH*)沉孔一律抛 `E_RECESS_TAPER_UNSUPPORTED`;Robertson(R*)
|
|
22
|
+
* 上游 taper=0、不受影响,正常实现。受影响的类用 T/slot 类型过验收
|
|
23
|
+
* (见 gen-reference.py SCREW_CASES 注释)。
|
|
24
|
+
*
|
|
25
|
+
* ## 本文件的两节(互不依赖)
|
|
26
|
+
*
|
|
27
|
+
* 1. **W5 沉孔模块**(本节以上):`fastener.py:226-347` 的五种 plan +
|
|
28
|
+
* `default_head_recess` + `make_head` 的切割器构造,服务 `src/screw.ts` 的 12 类。
|
|
29
|
+
* 2. **W4 临时孔径切割器**(文件末节,`Temp` 前缀):`extensions._fastenerHole`
|
|
30
|
+
* 的最小等价路径,只服务 `src/nut.ts` 的 `bradTeeNut`;替换目标是 W9·P1-b 的
|
|
31
|
+
* `src/holes.ts`。两节之间**禁止互相引用**。
|
|
32
|
+
*/
|
|
33
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
34
|
+
import { type ParamRow } from './params.js';
|
|
35
|
+
/** 沉孔三元组:plan wire(XY 面、z=0)+ 深度 + 锥角(度)。 */
|
|
36
|
+
export interface RecessSpec {
|
|
37
|
+
planWire: BrepHandle;
|
|
38
|
+
depth: number;
|
|
39
|
+
taperDeg: number;
|
|
40
|
+
}
|
|
41
|
+
/** cross(PH)槽深表(按 PH 规格索引)——`fastener.py:232` 逐字。 */
|
|
42
|
+
declare const CROSS_DEPTHS: Record<string, number>;
|
|
43
|
+
/** Robertson(R)槽深表(按 R 规格索引)——`fastener.py:336` 逐字。 */
|
|
44
|
+
declare const SQUARE_DEPTHS: Record<string, number>;
|
|
45
|
+
/**
|
|
46
|
+
* cross / Type H 沉孔 plan(`fastener.py:226 cross_recess`)。
|
|
47
|
+
* 12 边十字;4 个内角(±w/12, ±w/12)用 `fillet2D(m/3)` 圆化。
|
|
48
|
+
* A 侧实证(probe31/37/41):圆化后面积 11.262240262 逐位一致。
|
|
49
|
+
* @param size - PH0…PH4。
|
|
50
|
+
* @returns plan wire。
|
|
51
|
+
*/
|
|
52
|
+
export declare function crossRecessPlanWire(size: string): BrepHandle;
|
|
53
|
+
/**
|
|
54
|
+
* 六角沉孔 plan(`fastener.py:257 hex_recess`):`polygon(6, polygon_diagonal(s))`。
|
|
55
|
+
* @param widthAcrossFlats - 对边距 s。
|
|
56
|
+
* @returns plan wire。
|
|
57
|
+
*/
|
|
58
|
+
export declare function hexRecessPlanWire(widthAcrossFlats: number): BrepHandle;
|
|
59
|
+
/**
|
|
60
|
+
* hexalobular(Torx® T)沉孔 plan(`fastener.py:265 hexalobular_recess`)。
|
|
61
|
+
* 六分之一轮廓 = 外弧(Re)→内弧(−Ri)→外弧(Re) 三段 radiusArc,再绕 Z 每 −60°
|
|
62
|
+
* 复制 6 份(clockwise,与上游 `range(0,-360,-60)` 一致)。
|
|
63
|
+
* A 侧实证(probe27/28):T30 plan 面积 17.521497 与 A 侧一致。
|
|
64
|
+
* @param size - T6…T100。
|
|
65
|
+
* @returns plan wire。
|
|
66
|
+
*/
|
|
67
|
+
export declare function hexalobularRecessPlanWire(size: string): BrepHandle;
|
|
68
|
+
/**
|
|
69
|
+
* 开槽沉孔 plan(`fastener.py:323 slot_recess`):`rect(width, length)`
|
|
70
|
+
* (cq rect 以原点为中心)。length 方向必须超出头顶面——上游由
|
|
71
|
+
* `make_head` 用 3×maxR 的默认 plan 包容(slot 的 length 参数是 n,宽度 dk)。
|
|
72
|
+
* 等等——上游 slot_recess(dk, n):**宽度 dk、长度 n**,而 n < dk;
|
|
73
|
+
* `make_head` 注释说明 slot 横贯整个头、必须伸出顶面,故矩形以原点为中心、
|
|
74
|
+
* 长边 = dk 落在 X、短边 = n 落在 Y。
|
|
75
|
+
* @param width - X 向边长(= dk,横贯头径)。
|
|
76
|
+
* @param length - Y 向边长(= 槽宽 n)。
|
|
77
|
+
* @returns plan wire。
|
|
78
|
+
*/
|
|
79
|
+
export declare function slotRecessPlanWire(width: number, length: number): BrepHandle;
|
|
80
|
+
/**
|
|
81
|
+
* Robertson 方沉孔 plan(`fastener.py:328 square_recess`):`rect(m, m)`。
|
|
82
|
+
* @param size - R00…R3。
|
|
83
|
+
* @returns plan wire。
|
|
84
|
+
*/
|
|
85
|
+
export declare function squareRecessPlanWire(size: string): BrepHandle;
|
|
86
|
+
/**
|
|
87
|
+
* `fastener.py:1576 default_head_recess`:按 screw_data 列名依序探测
|
|
88
|
+
* slot(dk,n,t) → hex(s,t) → recess 列(PH/T/R),返回三元组。
|
|
89
|
+
* 与上游一致:多个 try 块**后面的命中会覆盖前面的**(fastener.py 逐 try 赋值)。
|
|
90
|
+
* @param row - 该规格的参数行(已 isolate 到具体 fastener_type)。
|
|
91
|
+
* @returns 沉孔三元组。
|
|
92
|
+
* @throws PH(cross,taper=30°)→ `E_RECESS_TAPER_UNSUPPORTED`(W5 已知缺口);
|
|
93
|
+
* 无任何沉孔列 → 上游同文报错。
|
|
94
|
+
*/
|
|
95
|
+
export declare function defaultHeadRecess(row: ParamRow): RecessSpec;
|
|
96
|
+
/**
|
|
97
|
+
* 沉孔切割器(`make_head` fastener.py:1548-1552 的 B 侧等价):
|
|
98
|
+
* draftPrism 向上(远端收缩)→ 关于 XY 镜像 → 平移到头顶 z=topZ。
|
|
99
|
+
* 结果占 z ∈ [topZ−depth, topZ],开口(全尺寸截面)朝上。
|
|
100
|
+
* @param spec - 沉孔三元组。
|
|
101
|
+
* @param topZ - 头顶面高度(max_head_height)。
|
|
102
|
+
* @returns 切割器实体。
|
|
103
|
+
*/
|
|
104
|
+
export declare function recessCutter(spec: RecessSpec, topZ: number): BrepHandle;
|
|
105
|
+
/** SQUARE_DEPTHS 仅 square_recess 用;导出供测试对表。 */
|
|
106
|
+
export { SQUARE_DEPTHS, CROSS_DEPTHS };
|
|
107
|
+
/** 钻尖角(度)—— 上游 `_fastenerHole` 的 `cskAngle = 82`(extensions.py:975)。 */
|
|
108
|
+
export { DRILL_TIP_ANGLE } from './holes.js';
|
|
109
|
+
/** 沉头轮廓(XZ 平面 `{r,z}` 点列,闭合,`r` 为到轴距离)。 */
|
|
110
|
+
export interface TempProfilePoint {
|
|
111
|
+
r: number;
|
|
112
|
+
z: number;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* `CounterSunkScrew.countersink_profile`(fastener.py:1786-1798)的临时等价实现 —— 90° 截锥。
|
|
116
|
+
*
|
|
117
|
+
* 上游逐字转写:`vLineTo(k)` → `hLineTo(dk/2)` → `polarLine(k/cos(a/2), -90-a/2)` → `close()`。
|
|
118
|
+
*
|
|
119
|
+
* ⚠️ 注意上游此方法**不读 `fit`**(与 `Screw.default_countersink_profile` 不同):
|
|
120
|
+
* 轮廓只由 `a`(头角)/`dk`(头径)/`k`(头高)决定。参数里的 `fit` 仅为签名对齐。
|
|
121
|
+
*
|
|
122
|
+
* ⚠️ 与 `src/screw.ts` 的 `CounterSunkScrew` 沉孔轮廓**同式**:该重复是 W4 明示的
|
|
123
|
+
* 临时债(见本文件头与 W5 分析文档),随 `_fastenerHole` 整体迁入 `src/holes.ts` 时一并消除。
|
|
124
|
+
* @param screwData - `countersunk_head_parameters.csv` 中该规格行的求值结果(含 a/dk/k)。
|
|
125
|
+
* @param _fit - 配合等级(上游此路径未使用)。
|
|
126
|
+
* @returns 截锥轮廓点列:`(0,0) → (0,k) → (dk/2,k) → (dk/2−k·tan(a/2), 0)`。
|
|
127
|
+
*/
|
|
128
|
+
export declare function tempCounterSunkCountersinkProfile(screwData: Record<string, number | string>, _fit?: 'Close' | 'Normal' | 'Loose'): TempProfilePoint[];
|
|
129
|
+
//# sourceMappingURL=recess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recess.d.ts","sourceRoot":"","sources":["../src/recess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAA;AAazD,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AASrD,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,UAAU,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAID,qDAAqD;AACrD,QAAA,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAA2D,CAAA;AAGpG,uDAAuD;AACvD,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAyD,CAAA;AASnG;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAkD5D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,GAAG,UAAU,CAStE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAyClE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAS5E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAI7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,UAAU,CA+C3D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAKvE;AAED,+CAA+C;AAC/C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA;AAQtC,wEAAwE;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzC,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iCAAiC,CAC/C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAC1C,IAAI,GAAE,OAAO,GAAG,QAAQ,GAAG,OAAkB,GAC5C,gBAAgB,EAAE,CAmBpB"}
|
package/dist/recess.js
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recess.ts — W5 螺钉沉孔切割器(方案 §5.4 W5 交付物)。
|
|
3
|
+
*
|
|
4
|
+
* ≈ 上游 `fastener.py:226-347` 的五种沉孔 plan + `default_head_recess`
|
|
5
|
+
* (fastener.py:1576)的 plan/depth/taper 三元组,以及 `make_head`
|
|
6
|
+
* (fastener.py:1513)里的切割器构造:
|
|
7
|
+
*
|
|
8
|
+
* cutter = extrudeLinear(plan, (0,0,-depth), taper).translate((0,0,topZ))
|
|
9
|
+
* head_blank = plan Extrude(topZ) − cutter
|
|
10
|
+
* head = revolved_profile ∩ head_blank
|
|
11
|
+
*
|
|
12
|
+
* B 侧等价替换(探针 §W5-probe11/12 实证,体积解析对齐):
|
|
13
|
+
* draftPrism 只能沿 +dz 收缩远端,与上游「从顶面向下收」的切割器方向相反——
|
|
14
|
+
* 先向上拔模拉伸(远端收缩)、再关于 XY 面镜像、平移到头顶,三步合成。
|
|
15
|
+
*
|
|
16
|
+
* ⚠️ W5 已知缺口(红线:未验证的路径必须显式抛错,禁止静默近似):
|
|
17
|
+
* taper=30° 的截面随深度收缩,臂宽(PH: m/12,R: m/2)在深度
|
|
18
|
+
* h* = (m/12)/tan30° ≈ 0.76·m/12… 内归零,之后 A 侧 LocOpe_DPrism 靠
|
|
19
|
+
* 「截面自交后续生锥面」继续成型(实测 PH2 切割器 z 底 −2.349、含 4 锥面),
|
|
20
|
+
* 本内核 draftPrism 在自交前即抛错(探针 §W5-probe50:深 0.8 即失败)。
|
|
21
|
+
* → cross(PH*)沉孔一律抛 `E_RECESS_TAPER_UNSUPPORTED`;Robertson(R*)
|
|
22
|
+
* 上游 taper=0、不受影响,正常实现。受影响的类用 T/slot 类型过验收
|
|
23
|
+
* (见 gen-reference.py SCREW_CASES 注释)。
|
|
24
|
+
*
|
|
25
|
+
* ## 本文件的两节(互不依赖)
|
|
26
|
+
*
|
|
27
|
+
* 1. **W5 沉孔模块**(本节以上):`fastener.py:226-347` 的五种 plan +
|
|
28
|
+
* `default_head_recess` + `make_head` 的切割器构造,服务 `src/screw.ts` 的 12 类。
|
|
29
|
+
* 2. **W4 临时孔径切割器**(文件末节,`Temp` 前缀):`extensions._fastenerHole`
|
|
30
|
+
* 的最小等价路径,只服务 `src/nut.ts` 的 `bradTeeNut`;替换目标是 W9·P1-b 的
|
|
31
|
+
* `src/holes.ts`。两节之间**禁止互相引用**。
|
|
32
|
+
*/
|
|
33
|
+
import { requireKernel } from './kernel.js';
|
|
34
|
+
import { arcEdge, draftPrismFace, filletCorner2D, lineEdge, mirrorAbout, polygonWire, radiusArcMidpoint, rotateAbout, wireFromEdges, } from './primitives.js';
|
|
35
|
+
import { iso10664Def } from './params.js';
|
|
36
|
+
/** 本包内部统一经 WarehouseKernel 取用。 */
|
|
37
|
+
function k() {
|
|
38
|
+
return requireKernel();
|
|
39
|
+
}
|
|
40
|
+
const Z_AXIS = { point: { x: 0, y: 0, z: 0 }, direction: { x: 0, y: 0, z: 1 } };
|
|
41
|
+
/** cross(PH)/ Robertson(R)尺寸表——`fastener.py:232/336` 逐字。 */
|
|
42
|
+
const CROSS_WIDTHS = { PH0: 1.9, PH1: 3.1, PH2: 5.3, PH3: 6.8, PH4: 10.0 };
|
|
43
|
+
/** cross(PH)槽深表(按 PH 规格索引)——`fastener.py:232` 逐字。 */
|
|
44
|
+
const CROSS_DEPTHS = { PH0: 1.1, PH1: 2.0, PH2: 3.27, PH3: 3.53, PH4: 5.88 };
|
|
45
|
+
/** Robertson(R)槽宽表(按 R 规格索引)——`fastener.py:336` 逐字。 */
|
|
46
|
+
const SQUARE_WIDTHS = { R00: 1.8, R0: 2.31, R1: 2.86, R2: 3.38, R3: 4.85 };
|
|
47
|
+
/** Robertson(R)槽深表(按 R 规格索引)——`fastener.py:336` 逐字。 */
|
|
48
|
+
const SQUARE_DEPTHS = { R00: 1.85, R0: 2.87, R1: 3.56, R2: 4.19, R3: 5.11 };
|
|
49
|
+
/**
|
|
50
|
+
* 2D 点 → 世界坐标(XY 平面,z=0)。
|
|
51
|
+
*/
|
|
52
|
+
function v(p) {
|
|
53
|
+
return { x: p.x, y: p.y, z: 0 };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* cross / Type H 沉孔 plan(`fastener.py:226 cross_recess`)。
|
|
57
|
+
* 12 边十字;4 个内角(±w/12, ±w/12)用 `fillet2D(m/3)` 圆化。
|
|
58
|
+
* A 侧实证(probe31/37/41):圆化后面积 11.262240262 逐位一致。
|
|
59
|
+
* @param size - PH0…PH4。
|
|
60
|
+
* @returns plan wire。
|
|
61
|
+
*/
|
|
62
|
+
export function crossRecessPlanWire(size) {
|
|
63
|
+
const m = CROSS_WIDTHS[size];
|
|
64
|
+
if (m === undefined)
|
|
65
|
+
throw new Error(`cross_recess: invalid cross size ${size}`);
|
|
66
|
+
const w = m / 12;
|
|
67
|
+
const r = m / 3;
|
|
68
|
+
// 上游象限:moveTo(m/2,0)→vLineTo(m/12)→hLineTo(m/12)→vLineTo(m/2)→hLineTo(0)
|
|
69
|
+
// 经 mirrorX/mirrorY 展开后,臂尖上的镜像缝点((±m/2,0)/(0,±m/2))是共线冗余
|
|
70
|
+
// 顶点——几何等价的 12 角环(probe41 面积 11.262240262 与 A 侧逐位一致)。
|
|
71
|
+
const orig = [
|
|
72
|
+
{ x: m / 2, y: w },
|
|
73
|
+
{ x: w, y: w },
|
|
74
|
+
{ x: w, y: m / 2 },
|
|
75
|
+
{ x: -w, y: m / 2 },
|
|
76
|
+
{ x: -w, y: w },
|
|
77
|
+
{ x: -m / 2, y: w },
|
|
78
|
+
{ x: -m / 2, y: -w },
|
|
79
|
+
{ x: -w, y: -w },
|
|
80
|
+
{ x: -w, y: -m / 2 },
|
|
81
|
+
{ x: w, y: -m / 2 },
|
|
82
|
+
{ x: w, y: -w },
|
|
83
|
+
{ x: m / 2, y: -w },
|
|
84
|
+
];
|
|
85
|
+
// (±w,±w) 四个内角:索引 1、4、7、10。
|
|
86
|
+
const filletIdx = new Set([1, 4, 7, 10]);
|
|
87
|
+
const p1of = new Map();
|
|
88
|
+
const p2of = new Map();
|
|
89
|
+
const midof = new Map();
|
|
90
|
+
for (const i of filletIdx) {
|
|
91
|
+
const cur = orig[i];
|
|
92
|
+
const prev = orig[(i + 11) % 12];
|
|
93
|
+
const next = orig[(i + 1) % 12];
|
|
94
|
+
const f = filletCorner2D(prev, cur, next, r);
|
|
95
|
+
p1of.set(i, f.p1);
|
|
96
|
+
p2of.set(i, f.p2);
|
|
97
|
+
midof.set(i, f.mid);
|
|
98
|
+
}
|
|
99
|
+
const edges = [];
|
|
100
|
+
for (let i = 0; i < 12; i++) {
|
|
101
|
+
const cur = orig[i];
|
|
102
|
+
const next = orig[(i + 1) % 12];
|
|
103
|
+
if (filletIdx.has(i)) {
|
|
104
|
+
// 圆角顶点:P1→(arc)→P2,再接 P2→next 连线(探针 probe38 16 边闭合形态)。
|
|
105
|
+
edges.push(arcEdge(v(p1of.get(i)), v(midof.get(i)), v(p2of.get(i))));
|
|
106
|
+
edges.push(lineEdge(v(p2of.get(i)), v(next)));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const target = filletIdx.has((i + 1) % 12) ? p1of.get((i + 1) % 12) : next;
|
|
110
|
+
edges.push(lineEdge(v(cur), v(target)));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return wireFromEdges(edges);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 六角沉孔 plan(`fastener.py:257 hex_recess`):`polygon(6, polygon_diagonal(s))`。
|
|
117
|
+
* @param widthAcrossFlats - 对边距 s。
|
|
118
|
+
* @returns plan wire。
|
|
119
|
+
*/
|
|
120
|
+
export function hexRecessPlanWire(widthAcrossFlats) {
|
|
121
|
+
// polygon_diagonal(s, 6) = s/cos(π/6)(nut.ts polygonDiagonal 同式)。
|
|
122
|
+
const e = widthAcrossFlats / Math.cos(Math.PI / 6);
|
|
123
|
+
const pts = [];
|
|
124
|
+
for (let i = 0; i < 6; i++) {
|
|
125
|
+
const a = (Math.PI / 3) * i;
|
|
126
|
+
pts.push({ x: (e / 2) * Math.cos(a), y: (e / 2) * Math.sin(a), z: 0 });
|
|
127
|
+
}
|
|
128
|
+
return polygonWire(pts);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* hexalobular(Torx® T)沉孔 plan(`fastener.py:265 hexalobular_recess`)。
|
|
132
|
+
* 六分之一轮廓 = 外弧(Re)→内弧(−Ri)→外弧(Re) 三段 radiusArc,再绕 Z 每 −60°
|
|
133
|
+
* 复制 6 份(clockwise,与上游 `range(0,-360,-60)` 一致)。
|
|
134
|
+
* A 侧实证(probe27/28):T30 plan 面积 17.521497 与 A 侧一致。
|
|
135
|
+
* @param size - T6…T100。
|
|
136
|
+
* @returns plan wire。
|
|
137
|
+
*/
|
|
138
|
+
export function hexalobularRecessPlanWire(size) {
|
|
139
|
+
const row = iso10664Def[size];
|
|
140
|
+
if (!row)
|
|
141
|
+
throw new Error(`hexalobular_recess: invalid hexalobular size ${size}`);
|
|
142
|
+
const A = Number(row['A']);
|
|
143
|
+
const B = Number(row['B']);
|
|
144
|
+
const Re = Number(row['Re']);
|
|
145
|
+
const sqrt3 = Math.sqrt(3);
|
|
146
|
+
// Ri = (A²−√3·A·B−4·A·Re+B²+2√3·B·Re) / (2(√3·A−2·B−2√3·Re+4·Re))
|
|
147
|
+
const Ri = (A * A - sqrt3 * A * B - 4 * A * Re + B * B + 2 * sqrt3 * B * Re) /
|
|
148
|
+
(2 * (sqrt3 * A - 2 * B - 2 * sqrt3 * Re + 4 * Re));
|
|
149
|
+
const centerExternal0 = { x: 0, y: A / 2 - Re };
|
|
150
|
+
const centerExternal1 = { x: (sqrt3 * (A / 2 - Re)) / 2, y: A / 4 - Re / 2 };
|
|
151
|
+
const centerInternal = { x: B / 4 + Ri / 2, y: (sqrt3 * (B / 2 + Ri)) / 2 };
|
|
152
|
+
// 切点 = 外弧圆心 + 单位向量(内弧圆心−外弧圆心) × Re
|
|
153
|
+
const tangentPoints = [centerExternal0, centerExternal1].map((c) => {
|
|
154
|
+
const dx = centerInternal.x - c.x;
|
|
155
|
+
const dy = centerInternal.y - c.y;
|
|
156
|
+
const l = Math.hypot(dx, dy);
|
|
157
|
+
return { x: c.x + (dx / l) * Re, y: c.y + (dy / l) * Re };
|
|
158
|
+
});
|
|
159
|
+
// 六分之一:moveTo(0, A/2) → radiusArc(tp0, Re) → radiusArc(tp1, −Ri)
|
|
160
|
+
// → radiusArc((√3A/4, A/4), Re)
|
|
161
|
+
const start = { x: 0, y: A / 2 };
|
|
162
|
+
const end = { x: (sqrt3 * A) / 4, y: A / 4 };
|
|
163
|
+
const m1 = radiusArcMidpoint(start, tangentPoints[0], Re);
|
|
164
|
+
const m2 = radiusArcMidpoint(tangentPoints[0], tangentPoints[1], -Ri);
|
|
165
|
+
const m3 = radiusArcMidpoint(tangentPoints[1], end, Re);
|
|
166
|
+
const oneSixth = [
|
|
167
|
+
arcEdge(v(start), v(m1), v(tangentPoints[0])),
|
|
168
|
+
arcEdge(v(tangentPoints[0]), v(m2), v(tangentPoints[1])),
|
|
169
|
+
arcEdge(v(tangentPoints[1]), v(m3), v(end)),
|
|
170
|
+
];
|
|
171
|
+
const edges = [];
|
|
172
|
+
for (let a = 0; a > -360; a -= 60) {
|
|
173
|
+
const rad = (a * Math.PI) / 180;
|
|
174
|
+
for (const e of oneSixth)
|
|
175
|
+
edges.push(rotateAbout(e, Z_AXIS, rad));
|
|
176
|
+
}
|
|
177
|
+
return wireFromEdges(edges);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 开槽沉孔 plan(`fastener.py:323 slot_recess`):`rect(width, length)`
|
|
181
|
+
* (cq rect 以原点为中心)。length 方向必须超出头顶面——上游由
|
|
182
|
+
* `make_head` 用 3×maxR 的默认 plan 包容(slot 的 length 参数是 n,宽度 dk)。
|
|
183
|
+
* 等等——上游 slot_recess(dk, n):**宽度 dk、长度 n**,而 n < dk;
|
|
184
|
+
* `make_head` 注释说明 slot 横贯整个头、必须伸出顶面,故矩形以原点为中心、
|
|
185
|
+
* 长边 = dk 落在 X、短边 = n 落在 Y。
|
|
186
|
+
* @param width - X 向边长(= dk,横贯头径)。
|
|
187
|
+
* @param length - Y 向边长(= 槽宽 n)。
|
|
188
|
+
* @returns plan wire。
|
|
189
|
+
*/
|
|
190
|
+
export function slotRecessPlanWire(width, length) {
|
|
191
|
+
const hw = width / 2;
|
|
192
|
+
const hl = length / 2;
|
|
193
|
+
return wireFromEdges([
|
|
194
|
+
lineEdge(v({ x: -hw, y: -hl }), v({ x: hw, y: -hl })),
|
|
195
|
+
lineEdge(v({ x: hw, y: -hl }), v({ x: hw, y: hl })),
|
|
196
|
+
lineEdge(v({ x: hw, y: hl }), v({ x: -hw, y: hl })),
|
|
197
|
+
lineEdge(v({ x: -hw, y: hl }), v({ x: -hw, y: -hl })),
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Robertson 方沉孔 plan(`fastener.py:328 square_recess`):`rect(m, m)`。
|
|
202
|
+
* @param size - R00…R3。
|
|
203
|
+
* @returns plan wire。
|
|
204
|
+
*/
|
|
205
|
+
export function squareRecessPlanWire(size) {
|
|
206
|
+
const m = SQUARE_WIDTHS[size];
|
|
207
|
+
if (m === undefined)
|
|
208
|
+
throw new Error(`square_recess: invalid square size ${size}`);
|
|
209
|
+
return slotRecessPlanWire(m, m);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* `fastener.py:1576 default_head_recess`:按 screw_data 列名依序探测
|
|
213
|
+
* slot(dk,n,t) → hex(s,t) → recess 列(PH/T/R),返回三元组。
|
|
214
|
+
* 与上游一致:多个 try 块**后面的命中会覆盖前面的**(fastener.py 逐 try 赋值)。
|
|
215
|
+
* @param row - 该规格的参数行(已 isolate 到具体 fastener_type)。
|
|
216
|
+
* @returns 沉孔三元组。
|
|
217
|
+
* @throws PH(cross,taper=30°)→ `E_RECESS_TAPER_UNSUPPORTED`(W5 已知缺口);
|
|
218
|
+
* 无任何沉孔列 → 上游同文报错。
|
|
219
|
+
*/
|
|
220
|
+
export function defaultHeadRecess(row) {
|
|
221
|
+
let spec = null;
|
|
222
|
+
// Slot Recess:dk, n, t → slot_recess(dk, n),taper=0
|
|
223
|
+
if (row['dk'] !== undefined && row['n'] !== undefined && row['t'] !== undefined) {
|
|
224
|
+
spec = {
|
|
225
|
+
planWire: slotRecessPlanWire(Number(row['dk']), Number(row['n'])),
|
|
226
|
+
depth: Number(row['t']),
|
|
227
|
+
taperDeg: 0,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Hex Recess:s, t → hex_recess(s),taper=0
|
|
231
|
+
if (row['s'] !== undefined && row['t'] !== undefined) {
|
|
232
|
+
spec = {
|
|
233
|
+
planWire: hexRecessPlanWire(Number(row['s'])),
|
|
234
|
+
depth: Number(row['t']),
|
|
235
|
+
taperDeg: 0,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
// Philips / Torx / Robertson:recess 列
|
|
239
|
+
const recess = row['recess'];
|
|
240
|
+
if (recess !== undefined && recess !== '') {
|
|
241
|
+
const r = String(recess).toUpperCase();
|
|
242
|
+
if (r.startsWith('PH')) {
|
|
243
|
+
// W5 已知缺口:cross 沉孔 30° 锥度在臂宽退化后 A 侧靠 DPrism 续锥面,
|
|
244
|
+
// 本内核 draftPrism 自交即抛错(见文件头)。
|
|
245
|
+
throw new Error(`E_RECESS_TAPER_UNSUPPORTED: cross recess ${r} needs a 30° taper cutter whose ` +
|
|
246
|
+
`section self-intersects (LocOpe_DPrism tolerates, our draftPrism does not) — ` +
|
|
247
|
+
`choose a T/slot/hex fastener_type instead`);
|
|
248
|
+
}
|
|
249
|
+
if (r.startsWith('T')) {
|
|
250
|
+
spec = {
|
|
251
|
+
planWire: hexalobularRecessPlanWire(r),
|
|
252
|
+
depth: 0.6 * Number(iso10664Def[r]['A']),
|
|
253
|
+
taperDeg: 0,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
else if (r.startsWith('R')) {
|
|
257
|
+
spec = {
|
|
258
|
+
planWire: squareRecessPlanWire(r),
|
|
259
|
+
depth: SQUARE_DEPTHS[r],
|
|
260
|
+
taperDeg: 0,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (!spec)
|
|
265
|
+
throw new Error(`Recess data missing from screw_data ${JSON.stringify(row)}`);
|
|
266
|
+
return spec;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* 沉孔切割器(`make_head` fastener.py:1548-1552 的 B 侧等价):
|
|
270
|
+
* draftPrism 向上(远端收缩)→ 关于 XY 镜像 → 平移到头顶 z=topZ。
|
|
271
|
+
* 结果占 z ∈ [topZ−depth, topZ],开口(全尺寸截面)朝上。
|
|
272
|
+
* @param spec - 沉孔三元组。
|
|
273
|
+
* @param topZ - 头顶面高度(max_head_height)。
|
|
274
|
+
* @returns 切割器实体。
|
|
275
|
+
*/
|
|
276
|
+
export function recessCutter(spec, topZ) {
|
|
277
|
+
const face = k().makeFace(spec.planWire);
|
|
278
|
+
const up = spec.taperDeg === 0 ? k().extrude(face, 0, 0, spec.depth) : draftPrismFace(face, spec.depth, spec.taperDeg);
|
|
279
|
+
const flipped = mirrorAbout(up, { x: 0, y: 0, z: 0 }, { x: 0, y: 0, z: 1 });
|
|
280
|
+
return k().translate(flipped, 0, 0, topZ);
|
|
281
|
+
}
|
|
282
|
+
/** SQUARE_DEPTHS 仅 square_recess 用;导出供测试对表。 */
|
|
283
|
+
export { SQUARE_DEPTHS, CROSS_DEPTHS };
|
|
284
|
+
// ── W4:`extensions._fastenerHole` 的最小等价路径(BradTeeNut 用)────────────
|
|
285
|
+
//
|
|
286
|
+
// W9·P1-b 已落地:孔切割器迁入 `src/holes.ts`(`fastenerHoleCutter`),本文件
|
|
287
|
+
// 仅保留 `tempCounterSunkCountersinkProfile`(沉头轮廓,BradTeeNut 仍在用)。
|
|
288
|
+
// 原 `TempClearanceHoleCutterParams` / `tempClearanceHoleCutter` 已随迁移删除。
|
|
289
|
+
/** 钻尖角(度)—— 上游 `_fastenerHole` 的 `cskAngle = 82`(extensions.py:975)。 */
|
|
290
|
+
export { DRILL_TIP_ANGLE } from './holes.js';
|
|
291
|
+
/**
|
|
292
|
+
* `CounterSunkScrew.countersink_profile`(fastener.py:1786-1798)的临时等价实现 —— 90° 截锥。
|
|
293
|
+
*
|
|
294
|
+
* 上游逐字转写:`vLineTo(k)` → `hLineTo(dk/2)` → `polarLine(k/cos(a/2), -90-a/2)` → `close()`。
|
|
295
|
+
*
|
|
296
|
+
* ⚠️ 注意上游此方法**不读 `fit`**(与 `Screw.default_countersink_profile` 不同):
|
|
297
|
+
* 轮廓只由 `a`(头角)/`dk`(头径)/`k`(头高)决定。参数里的 `fit` 仅为签名对齐。
|
|
298
|
+
*
|
|
299
|
+
* ⚠️ 与 `src/screw.ts` 的 `CounterSunkScrew` 沉孔轮廓**同式**:该重复是 W4 明示的
|
|
300
|
+
* 临时债(见本文件头与 W5 分析文档),随 `_fastenerHole` 整体迁入 `src/holes.ts` 时一并消除。
|
|
301
|
+
* @param screwData - `countersunk_head_parameters.csv` 中该规格行的求值结果(含 a/dk/k)。
|
|
302
|
+
* @param _fit - 配合等级(上游此路径未使用)。
|
|
303
|
+
* @returns 截锥轮廓点列:`(0,0) → (0,k) → (dk/2,k) → (dk/2−k·tan(a/2), 0)`。
|
|
304
|
+
*/
|
|
305
|
+
export function tempCounterSunkCountersinkProfile(screwData, _fit = 'Normal') {
|
|
306
|
+
const a = screwData['a'];
|
|
307
|
+
const dk = screwData['dk'];
|
|
308
|
+
const k = screwData['k'];
|
|
309
|
+
if (typeof a !== 'number' || typeof dk !== 'number' || typeof k !== 'number')
|
|
310
|
+
throw new Error(`recess(Temp): countersunk screw data must be numeric (a/dk/k), got ${JSON.stringify({ a, dk, k })}`);
|
|
311
|
+
const half = ((a * Math.PI) / 180) / 2;
|
|
312
|
+
const sideLength = k / Math.cos(half);
|
|
313
|
+
const dir = ((-90 - a / 2) * Math.PI) / 180;
|
|
314
|
+
const endR = dk / 2 + sideLength * Math.cos(dir);
|
|
315
|
+
const endZ = k + sideLength * Math.sin(dir);
|
|
316
|
+
return [
|
|
317
|
+
{ r: 0, z: 0 },
|
|
318
|
+
{ r: 0, z: k },
|
|
319
|
+
{ r: dk / 2, z: k },
|
|
320
|
+
{ r: endR, z: endZ },
|
|
321
|
+
];
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=recess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recess.js","sourceRoot":"","sources":["../src/recess.ts"],"names":[],"mappings":"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"}
|
package/dist/screw.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* screw.ts — 螺钉 12 类(W5)—— 上游 `cq_warehouse.fastener.Screw` 基类 + 12 个子类的逐位复刻。
|
|
3
|
+
*
|
|
4
|
+
* 装配流(`fastener.py:1513 make_head` + `:176 __init__`):
|
|
5
|
+
* ```
|
|
6
|
+
* head = revolve(head_profile) ∩ extrude(head_plan) # 有 recess 时先 cut 再交
|
|
7
|
+
* ∪ revolve(flange_profile) # HexHeadWithFlange 才有
|
|
8
|
+
* cq_object = head.translate((0,0,-length_offset)) ∪ shank.translate((0,0,-length))
|
|
9
|
+
* shank = circle(min_radius).extrude(thread_length)(simple)或 shank.fuse(thread)
|
|
10
|
+
* ```
|
|
11
|
+
* `SetScrew` 走 `custom_make`:无头、全杆长、`cylinder − 六角沉孔`。
|
|
12
|
+
*
|
|
13
|
+
* 几何坐标:轮廓画在 XZ 平面(局部 x → 世界 X=半径、局部 y → 世界 +Z),
|
|
14
|
+
* `revolveProfile` 绕 Z 轴 360°。杆部 z ∈ [−length, −length_offset],
|
|
15
|
+
* 头部 z ∈ [−length_offset, −length_offset + head_height)。
|
|
16
|
+
*
|
|
17
|
+
* 逐位复刻的三个关键事实(A 侧实测见 `scripts/probe-screw-head-profiles.py`,
|
|
18
|
+
* 回归锁在 `src/screw.test.ts`;分析见
|
|
19
|
+
* `docs/analysis/2026-09-14-cq-warehouse-screw-probe.md`):
|
|
20
|
+
*
|
|
21
|
+
* 1. **`vertices(">X")` / `edges(">Z").vertices(">X")` 用的是 `Edge.Center()`**,
|
|
22
|
+
* 而圆弧的 `Edge.Center()` 是**圆弧质心而非圆心**——见 {@link edgeCenter}。
|
|
23
|
+
* 2. **`CheeseHeadScrew` 的 `k / cos(degrees(5))` 单位怪癖**:`math.degrees(5)`
|
|
24
|
+
* 的结果(286.4789)被当**弧度**喂给 `cos`,故长度为负;与 `5-90 = -85°`
|
|
25
|
+
* 方向叠加后实测等效于「沿 5° 内倾母线向上」。直接照抄公式即得正确几何。
|
|
26
|
+
* 3. **`fillet2D` 的圆弧邻边必须走圆心连线的精确解**:`t = r/tan(θ/2)` 只对
|
|
27
|
+
* 「两直线角」精确,用在「圆弧-直线」角上会把切点放到**弧外**
|
|
28
|
+
* (RCOS 实测 `|p1 − 圆心| = 12.00099 ≠ rf = 12`,误差 2.0e-3)——见
|
|
29
|
+
* {@link filletAt}。
|
|
30
|
+
*/
|
|
31
|
+
import type { BrepHandle } from '@faicad/faijs';
|
|
32
|
+
import { type ParamRow, type ScrewClassName } from './params.js';
|
|
33
|
+
import { type Hand } from './thread.js';
|
|
34
|
+
/** XZ 平面轮廓点:局部 (x, y),revolve 后局部 x→世界半径、局部 y→世界 +Z。 */
|
|
35
|
+
interface Pt {
|
|
36
|
+
x: number;
|
|
37
|
+
y: number;
|
|
38
|
+
}
|
|
39
|
+
/** 12 类共享的构造参数(上游 `Screw.__init__` 签名,fastener.py:176)。 */
|
|
40
|
+
export interface ScrewParams {
|
|
41
|
+
/** 尺寸串,如 `M6-1`(公制)或 `1/4-20`(英制)。 */
|
|
42
|
+
size: string;
|
|
43
|
+
/** 头下到螺纹端的总长(mm;`length_offset` 会把头高计入)。 */
|
|
44
|
+
length: number;
|
|
45
|
+
/** 类型标识,如 `iso4762`。 */
|
|
46
|
+
fastener_type: string;
|
|
47
|
+
/** 螺纹旋向,默认 `right`。 */
|
|
48
|
+
hand?: Hand;
|
|
49
|
+
/** 上游语义:True = 杆部光轴不建螺纹几何。 */
|
|
50
|
+
simple?: boolean;
|
|
51
|
+
/** 六角头类的扳手空间(默认 6,跨直径)。 */
|
|
52
|
+
socket_clearance?: number;
|
|
53
|
+
}
|
|
54
|
+
/** `Screw.__init__` 的派生量集合(上游同名属性/方法)。 */
|
|
55
|
+
export interface ScrewResult {
|
|
56
|
+
/** 螺钉实体;`custom_make` 未产出几何时为 null。 */
|
|
57
|
+
handle: BrepHandle | null;
|
|
58
|
+
screwClass: ScrewClassName;
|
|
59
|
+
size: string;
|
|
60
|
+
threadSize: string;
|
|
61
|
+
isMetric: boolean;
|
|
62
|
+
threadDiameter: number;
|
|
63
|
+
threadPitch: number;
|
|
64
|
+
length: number;
|
|
65
|
+
fastenerType: string;
|
|
66
|
+
hand: Hand;
|
|
67
|
+
simple: boolean;
|
|
68
|
+
screwData: ParamRow;
|
|
69
|
+
headHeight: number;
|
|
70
|
+
headDiameter: number;
|
|
71
|
+
maxThreadLength: number;
|
|
72
|
+
threadLength: number;
|
|
73
|
+
socketClearance: number;
|
|
74
|
+
/** `countersink_profile` 的顶点最大 z(上游 `min_hole_depth` 的 `head_offset`)。 */
|
|
75
|
+
headOffset: number | null;
|
|
76
|
+
/** `min_hole_depth(counter_sunk=True)`:`length + head_offset − length_offset`。 */
|
|
77
|
+
minHoleDepth: number | null;
|
|
78
|
+
/** `min_hole_depth(counter_sunk=False)`:`length − length_offset`。 */
|
|
79
|
+
minHoleDepthStraight: number;
|
|
80
|
+
info: string;
|
|
81
|
+
}
|
|
82
|
+
/** 全部螺钉类名(= `SCREW_TABLES` 的键,按声明序;测试与比对脚本共用)。 */
|
|
83
|
+
export declare const SCREW_CLASSES: readonly ScrewClassName[];
|
|
84
|
+
/**
|
|
85
|
+
* 头型轮廓的**顶点序列**(首段起点 + 各段终点,含 `fillet2D` 切点)——对应 A 侧
|
|
86
|
+
* `head_profile` 的边端点。逐位对照的回归锁通道(见 `src/screw.test.ts`),
|
|
87
|
+
* 也是 W9·P1-b 复用沉孔轮廓的入口。
|
|
88
|
+
* @param className - 12 类之一。
|
|
89
|
+
* @param p - 入参(只需 `size` / `fastener_type` 等,`length` 不参与轮廓)。
|
|
90
|
+
* @returns XZ 顶点列(局部 x→半径、y→轴向);`SetScrew` 无头型时返回 `[]`。
|
|
91
|
+
*/
|
|
92
|
+
export declare function screwProfilePoints(className: ScrewClassName, p: ScrewParams): Pt[];
|
|
93
|
+
/**
|
|
94
|
+
* `Screw.__init__`(`fastener.py:176`)的 B 侧复刻:解析 + 装配 + 派生量。
|
|
95
|
+
* @param className - 12 类之一(决定参数表与钩子集)。
|
|
96
|
+
* @param p - 入参。
|
|
97
|
+
* @returns 螺钉实体与上游同名派生量。
|
|
98
|
+
*/
|
|
99
|
+
export declare function buildScrew(className: ScrewClassName, p: ScrewParams): ScrewResult;
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=screw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screw.d.ts","sourceRoot":"","sources":["../src/screw.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,eAAe,CAAA;AAkBzD,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,cAAc,EACpB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAkC,KAAK,IAAI,EAAE,MAAM,UAAU,CAAA;AAGpE,wDAAwD;AACxD,UAAU,EAAE;IACV,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAwcD,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,uBAAuB;IACvB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,2BAA2B;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB,UAAU,EAAE,cAAc,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,kFAAkF;IAClF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,qEAAqE;IACrE,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;CACb;AAoCD,kDAAkD;AAClD,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EAE9B,CAAA;AA8YrB;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW,GAAG,EAAE,EAAE,CAKlF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW,GAAG,WAAW,CAmGjF"}
|