📖 功能概述
输入一个基点和轴向向量,根据选定的螺钉规格,同时生成多种不同类型的圆孔(过孔/底孔/工艺孔/机丝孔)实体。每种孔类型对应不同的孔径标准,各自的输出端口可通过自定义 UI 面板独立开关。
💡 核心特性:
- 四孔合一 — 一个组件同时输出过孔(VH)、底孔(BH)、工艺孔(PH)、机丝孔(TH),每种孔使用不同的孔径标准
- 自定义 UI 面板 — 右键菜单弹出带复选框和下拉菜单的配置面板,无需连线即可切换规格、材料、输出类型
- 动态输出端口 — 输出端口随 UI 开关自动显示/隐藏,画布整洁
- 手动半径覆盖 — 连接"半径"端口后可覆盖规格查表,自定义孔径(此时只输出过孔)
- HoleInfo 元数据 — 所有输出孔均附着类型和规格信息
🖥️ 自定义 UI 面板
右键点击组件,弹出自定义 MyUserControl5 面板,包含以下控件:
| 分组 | 控件 | 选项 | 说明 |
| 孔类型开关 |
4 个 CheckBox |
过孔(VH) / 底孔(BH) / 工艺孔(PH) / 机丝孔(TH) |
勾选后对应的输出端口显示并产生结果。可多选。 |
| 规格选择 |
Dropdown |
M3 ~ M16 |
选择螺钉规格,决定各孔径值 |
| 材料类型 |
Dropdown |
铝型材 / 钢型材 |
切换孔径取值表 |
| 锁定/解锁 |
CheckBox |
锁定 / 解锁 |
锁定状态下禁用规格选择和材料切换(当"半径"输入连接时自动锁定) |
| 攻丝类型 |
CheckBox |
攻丝 / 不攻丝 |
切换机丝孔的孔径标准(JSR / JSR2),仅影响 TH |
💡 UI ↔ 属性双向同步:所有 UI 控件的状态与组件内部属性(S1~S4, Sid, Sid2, Lock, Stp)双向绑定。通过 UI 面板或 Write/Read 反序列化修改都会保持同步。
📥 输入参数
| 名称 | 类型 | 必填 | 说明 |
| 点 (P) |
Point |
必需 |
圆孔的基点(默认隐藏)。孔的中轴线穿过此点。 |
| 向量 (V) |
Vector |
必需 |
圆孔的轴向方向(默认隐藏),组件内部自动单位化。 |
| 圆孔长度 (L) |
Number |
可选 |
孔的贯穿长度(默认 40)。必须 > 0,否则跳过求解。 |
| 半径 (R) |
Number |
可选 |
手动指定的半径值。连接后覆盖规格查表,且仅输出过孔(VH),其他孔类型自动禁用。 |
📤 输出参数(动态)
以下输出端口由 UI 面板中的复选框控制是否显示。默认仅"过孔"开启:
| 名称 | 类型 | 孔径来源 | 说明 |
| 过孔 (Via hole) (VH) |
Brep |
GKR[Sid]/2 或 手动R |
螺钉贯穿的通孔。默认开启。 |
| 底孔 (Bottom hole) (BH) |
Brep |
DKR[Sid]/2 |
用于攻丝前的预钻孔。默认关闭。 |
| 工艺孔 (Process hole) (PH) |
Brep |
GYKR[Sid]/2 |
加工工艺孔。默认关闭。 |
| 机丝孔 (Tapped hole) (TH) |
Brep |
JSR[Sid]/2 或 JSR2[Sid]/2 |
机丝攻丝孔,孔径由攻丝类型决定。默认关闭。 |
动态注册方式:勾选/取消勾选时,组件通过 Params.RegisterOutputParam() / Params.UnregisterOutputParameter() 动态添加或移除输出端口。
🧠 核心算法流程
🔍 步骤 2 详细:半径确定逻辑
| 条件 | 行为 |
| R == -1(未连接或值未改变) | 使用规格查表:根据 UI 选择的 Sid(规格索引)和 Sid2(铝/钢)从 GKR/DKR/GYKR/JSR 系列列表中获取对应的标准半径 |
| R != -1(手动输入) | 使用 R 值作为半径,且 只输出过孔(VH),Message 显示"φXXX圆孔" |
| Lock == true(自动锁定) | 当半径端口已有连线(SourceCount > 0)时,BeforeSolveInstance 中自动锁定 UI |
🔧 步骤 3 详细:几何构造
- 创建轴向线 —
Line(P, V, L),然后平移 L/2 使孔居中在 P 点两侧
- 管线生成 —
Brep.CreatePipe(line, radius, true, PipeCapMode.Round, true, 0.1, 0.1),带圆头封口的管状实体
- HoleInfo — 每个孔都通过
HoleInfo.SetHoleInfo() 附着类型("圆孔"/"机丝孔")和规格名称
- 输出 — 根据 S1~S4 开关状态,将对应的孔 Brep[] 设置到对应名称的输出端口
🔒 自动锁定机制
在 BeforeSolveInstance() 中执行 Rparam():
- 如果输入端口 4 存在且"半径"端口有源(已连线)→ 自动锁定(S1=true, S2=S3=S4=false, Lock=true, Stp=false),仅过孔输出
- 否则解除锁定,恢复 UI 控制权给用户
💾 序列化与状态持久化
组件通过 Write / Read 持久化以下状态:
| 属性 | 键 | 类型 | 说明 |
| S1 | Sty_1 | Boolean | 过孔开关 |
| S2 | Sty_2 | Boolean | 底孔开关 |
| S3 | Sty_3 | Boolean | 工艺孔开关 |
| S4 | Sty_4 | Boolean | 机丝孔开关 |
| Sid | SID | Integer | 规格索引 |
| Sid2 | SID2 | Integer | 材料索引 |
| Lock | Lock | Boolean | 锁定状态 |
🧪 典型使用场景
| 场景 | 说明 |
| 型材连接孔 |
输入型材立柱中心点位 + 方向,同时输出过孔和工艺孔,分别用于螺钉连接和加工定位。 |
| 攻丝前钻孔 |
开启底孔(BH)输出,生成攻丝前的预钻孔,再接入攻丝组件。 |
| 自定义非标孔 |
连接"半径"端口输入自定义直径,覆盖标准规格,生成单个非标过孔。 |
| 多规格比对 |
复制多个组件,分别设定不同规格,并排输出观察孔径差异。 |
⚠️ 注意事项
- 隐藏参数:点(P) 和向量(V) 默认隐藏。双击组件展开可看到所有端口。
- 半径覆盖优先级:如果半径端口不连接(默认 -1),使用规格查表。如果连接了,强制只输出过孔,其他口自动关闭。
- 底孔 vs 工艺孔:本组件中"底孔"使用 DKR 数据(用于攻丝前预钻),"工艺孔"使用 GYKR 数据(用于加工定位),两者不同。
- 孔长度:输入的 L 必须 > 0,否则 SolveInstance 直接返回不产生任何输出。
- Message 显示:手动输入半径时 Message 显示"φ6.4圆孔";规格模式时不额外显示信息。
- 重复输出:如果多个孔类型使用相同的孔径值(如 GKR == GYKR),生成多个形状完全相同的 Brep 是正常的。
📋 组件信息
| 名称 | 点转圆孔_改良 |
| 英文名 | 圆孔 (PointToHole_UI5) |
| 分类 | LK → Hole |
| 基类 | GH_Component + IGH_VariableParameterComponent |
| 特色 | 自定义UI面板、动态输出端口、4种孔类型、半径覆盖、自动锁定 |
| GUID | {FFDE8636-75AB-4A6B-AB0B-DA700402CEF8} |
更新日期:2026-06-29