📖 功能概述
该组件从LK系统型材的截面中提取最长外边线(即截面外轮廓的边界线),沿型材路径扫掠生成表皮模型。内部圆孔、沉头孔、机丝孔等开孔特征全部被忽略。
生成的扫掠体使用起端切面和终端切面进行分割,然后自动选取距离原始型材中心最近的一段作为最终结果。
降级处理:如果输入型材不包含LK系统标准属性,组件不会报错,而是直接输出原物件并给出提示信息——保证工作流不中断。
🧠 核心算法详解
一、截面 外边线 提取
这是整个算法的关键技术点。型材截面(Brep)包含复杂的边线网络——既有外轮廓边,也有内部孔洞边。
提取策略:根据长度排序取最长
1 遍历截面Brep的所有边(Edges),将每条边转为Nurbs曲线并收集到列表
2 使用 Curve.JoinCurves 将相连的边连接为更长的复合曲线
3 计算每条复合曲线的长度
4 按长度排序:取最长的那条曲线
为什么最长的那条就是外边线?
• 型材截面的外轮廓通常是最长的连续边线(因为内部孔洞和切割体的周长都远小于外轮廓)
• 即使截面形状复杂(如带翼缘的型材),外轮廓永远是最外围的闭合曲线
• 这种方法简单可靠,无需复杂的拓扑分析
二、沿路径扫掠
1 从型材属性中读取 拉伸-路径(Curve)
2 将提取的外边线包装为 IGH_GeometricGoo
3 使用 SuperExtrude 将外边线沿路径扫掠
→ 生成一个管状曲面实体
注意:这里扫掠的是单根开放的曲线(外轮廓边线),而非封闭的截面面片。
SuperExtrude 能处理曲线沿路径的扫掠,产生空间曲面。
三、端部分割与最近体选择
1 读取起端切面和终端切面(Brep)
2 使用 Brep.Split(切割面列表, 容差) 将扫掠体分割为多个Brep片段
→ 两个切割面会把扫掠体分成最多3段(左、中、右)
3 计算原始型材的中心点(Boundingbox.Center)
4 对所有切割后的Brep片段:
• 过滤无效或null的片段
• 计算每个片段边界框的中心
• 计算中心点与原始型材中心点的距离
• 按距离排序,取最近的一个
5 这个"最近片段"就是位于型材内部的有效表皮模型
为什么选择最近的一段?
切割后两端多余的片段位于切割面外部,它们的中心距离切割面的原始位置较远。只有位于两个切割面之间的片段——也就是型材的有效长度段——其中心才最靠近原始型材的中心。
⚙️ 完整执行流程
1. 输入获取:读取型材Brep。如果为空则退出。
2. 属性检查:通过ReferenceID定位Rhino场景物件,检查UserDictionary是否存在四个关键属性(拉伸-路径、拉伸-截面、起端切面、终端切面)。
• 如果缺少任意一个 → 输出原始物件 + Remark提示
• 如果全部存在 → 继续后续步骤
3. 属性提取:读取拉伸-路径(Curve)、拉伸-截面(Brep)、起端切面(Brep)、终端切面(Brep)。
4. 外边线提取:
a. 遍历截面Edges,全部转为NurbsCurve
b. Curve.JoinCurves 连接相连边
c. 按长度排序,取最长的一条
5. SuperExtrude扫掠:外边线沿路径扫掠
6. 端部分割:Brep.Split 用起端切面和终端切面分割
7. 最近体选择:从所有分割片段中选出距离原始型材中心最近的那个
8. 输出结果。