型材分类 型材分类

根据LK系统型材的多维属性信息进行智能分类,支持大批量并行处理,精确区分不同规格、不同孔位配置、不同镜像方向的型材
📂 LK → Util 📄 CompareBreps.cs ⚡ 并行计算 🔢 树形输入 🧩 特征签名

📖 功能概述

该组件以"特征签名分组"为核心策略,对输入的型材树形数据逐分支进行智能分类。 其核心思想是:将每个型材的所有可识别特征(尺寸、模号、物料编码、各类开孔位置、内部切割体、镜像方向等) 编码为一个唯一的特征字符串,然后将特征字符串完全一致的型材归入同一分组。

由于采用了多核并行的处理架构,即使面对大量型材数据也能高效完成分类运算。 适用于工厂BOM分类、加工批次管理、单元体构件分组等场景。

📥 输入参数

名称类型必填说明
型材 Brep 必填 树形 需要分组的型材模型。必须以树形结构输入,每个分支独立分类。每个型材必须是LK系统创建的、包含标准UserDictionary属性的模型。

📤 输出参数

名称类型说明
型材 Brep 分组后的型材模型,输出路径为 原始路径 → 分组子路径,同一分组内的型材在同一个子路径下 树形
序号 Number 分组后每个型材在原始输入列表中的索引序号,可用于追溯原始顺序 树形
数据 Text 每个型材对应的完整特征签名数据(包含模号、长度、面积、镜像方向、孔位信息等),用于验证分类依据 树形

🧠 核心算法:特征签名分组法

该组件不依赖传统几何比对(如布尔运算、曲率匹配),而是通过以下8个维度为每个型材生成一组唯一的特征签名,精确度足以区分毫米级差异的型材配置。

📐 特征提取维度

1. 模号 —— 型材的基础型号标识
直接从Rhino物件属性中读取 模号 字段。这是分组的首要维度,不同模号的型材必然分为不同组。

2. 边界框长度 —— 沿主方向的有效长度
将型材转换到局部坐标系后计算边界框(Box),取其沿主方向的长度值,精确到1位小数并取模2取整。此维度区分同模号下不同长度的截料。

3. 表面积 —— 型材的整体表面积
通过 Rhino 的 AreaMassProperties 计算型材总表面积,除以10000后保留2位有效数字。区分相同长度但截面复杂度不同的型材。

4. 镜像方向 —— 正反向判别
对型材截面进行切割面分析:以截面外包围矩形中心为基准,构建一个偏移半面的切割平面,用 BrepPlaneSplitAnalyzer 分析截面被分割后的两部分。根据比较结果输出 "正""反"。这是区分左右对称但方向不同的型材的关键维度。

5. 物料编码 & 工程属性 —— 辅助管理信息
读取 物料编码工程属性 字段作为附加分组的依据。

6. 孔位信息(圆孔 / 沉头孔 / 机丝孔) —— 各类孔洞的位置与尺寸
从用户字典中分别读取三类孔洞。对每个孔洞:
  • 通过 CylinderAnalyzer 提取圆心坐标半径
  • 将圆心转换到局部坐标系(映射到 WorldXY),得到局部坐标 (X, Y, Z);
  • X, Y, Z 各取一位小数后模2取整,半径放大4倍后模取1小数;
  • 生成字符串如:圆孔-12|34|56|80
每个孔洞生成一条签名,所有签名合并后按字母序排序,确保孔洞顺序不影响分组结果。

7. 内部切割体 —— 型材内部的铣切/切割特征
这是最复杂的维度。处理流程如下:
  • 读取截面沿路径扫掠重建纯净实体(通过 SuperExtrude);
  • 用起端切面和终端切面对重建实体进行 BooleanDifference,还原端部铣切造型;
  • 对每个内部切割体(内部切割体列表中的项目),使用 MultiThreadedBooleanIntersection 计算切割体与重建实体的交集;
  • 计算交集的局部坐标包围盒中心,生成签名如:切割体-3|12|34|56(3表示该型材有3个内部切割体);
  • 所有内部切割体签名同样按字母序排序。

🔗 签名的拼接与分组

以上所有维度的签名按固定顺序拼接成一个完整的特征字符串:

模号 + 长度 + 面积 + 镜像方向 + 物料编码 + 工程属性 + [排序后的孔位签名] + [排序后的角点签名] + [排序后的沉头孔签名] + [排序后的机丝孔签名] + [排序后的切割体签名]

然后使用 ObjectGrouper 以该特征字符串作为分组键(Key),将键完全相同的型材归入同一分组。

⚡ 并行处理架构

组件内部采用 Parallel.For 对输入每个分支内的型材进行并行特征提取。 在处理大量型材时,多核CPU的不同核心同时处理不同的型材,大幅缩短总处理时间。 但注意:特征提取过程中的错误会在并行上下文中被捕获并通过同步锁安全输出为运行时提示,不会导致整个求解崩溃。

⚙️ 完整执行流程

Step 1:输入参数校验
接收树形结构输入,检测数据量是否 ≥ 1。如果无数据则跳过。

Step 2:遍历输入分支
对于每个树形分支,获取分支内的所有型材(Brep),为分支内数据分配数组用于并行写入。

Step 3:并行特征提取(核心步骤)
对分支内的每个型材,启动并行任务:
通过 ReferenceID 找到 Rhino 场景中的对应物件
读取局部坐标平面(pln)和各属性字段
计算边界框、面积、镜像方向
提取各类孔洞的位置和尺寸签名
重建纯净实体,提取内部切割体签名
提取截面角点
拼接所有签名 → 生成特征字符串
Step 4:特征字符串排序
对孔位、角点、切割体等可重复项目的签名进行字母序排序。

Step 5:分组聚合
使用 ObjectGrouper 将特征字符串相同的型材归入同一分组。

Step 6:树形输出
每个分组作为一个子路径追加到原始路径下:
{原始路径} → {原始路径} + {分组索引}
输出分组后的型材、索引序号、特征数据。

🧪 典型使用场景

场景详细说明
型材批量分拣 工厂收到一批加工完成的型材,输入该组件后自动按模号+孔位配置+镜像方向分类,每类输出到一个子数据分支,方便后续逐类统计和打包。
开孔差异检测 同模号同长度的型材,如果圆孔或沉头孔的配置不同,特征签名将不同。通过该组件可以自动发现哪些型材的孔位配置是一样的,哪些是独特的。
镜像配对管理 通过镜像方向维度(正/反),自动识别互为镜像的型材。在装配工序中,正反成对使用的型材可以通过该组件自动匹配分组。
大规模型材数据预处理 项目包含数百根型材时,树形结构输入 + 并行处理确保分类效率。可以在Grasshopper中配合批量生成逻辑使用。

🔍 数据输出解读

输出的"数据"参数包含完整的特征签名,其格式如下:

模号,长度,面积,镜像方向,物料编码,工程属性,圆孔-X1|Y1|Z1|R1,圆孔-X2|Y2|Z2|R2,…,角点-X|Y|Z,…,沉头孔…,机丝孔…,切割体-Count|X|Y|Z,…

可以看到每个维度的信息以逗号分隔,各类孔位的签名已按字母序排列。

示例解读:
签名 A8012,1200.0,456.78,正,MC-001,普通,圆孔-10|20|30|40,圆孔-15|25|35|40,角点-0|0|0,角点-1200|0|0,沉头孔-50|0|0|80
表示:A8012模号,长度1200mm,面积456.78cm²,镜像方向为正,物料编码MC-001,有2个圆孔(分别位于局部坐标 (10,20,30) 和 (15,25,35)),角点2个,沉头孔1个,无内部切割体。

⚠️ 注意事项

📋 组件信息

名称型材分类
英文名型材分类
分类LK → Util
Exposuresecondary
基类GH_Component
GUID{629D3262-58B0-4586-BD6C-F819AF848003}