ProfileSurface 型材表皮 · PS

提取型材截面外边线沿路径生成纯净外皮模型,忽略内部所有开孔和切割体特征
📂 LK → Util 📄 ProfileSurface.cs 🧩 外轮廓 🎯 最近体选择

📖 功能概述

该组件从LK系统型材的截面中提取最长外边线(即截面外轮廓的边界线),沿型材路径扫掠生成表皮模型。内部圆孔、沉头孔、机丝孔等开孔特征全部被忽略。

生成的扫掠体使用起端切面和终端切面进行分割,然后自动选取距离原始型材中心最近的一段作为最终结果。

降级处理:如果输入型材不包含LK系统标准属性,组件不会报错,而是直接输出原物件并给出提示信息——保证工作流不中断。

📥 输入参数

名称类型必填说明
型材 Brep 必填 需要生成外皮模型的型材。如果包含LK标准属性(拉伸-路径、拉伸-截面、起端切面、终端切面),则执行完整的外皮生成算法;否则直接输出原物件。

📤 输出参数

名称类型说明
外皮模型 Brep 按照截面外轮廓边线沿路径生成的外皮模型。经过端部切割后,只输出距离原始型材中心最近的一段。树形

🧠 核心算法详解

一、截面 外边线 提取

这是整个算法的关键技术点。型材截面(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. 输出结果。

🧪 典型使用场景

场景详细说明
型材外轮廓提取 从含孔型材中提取纯净的外轮廓表皮,用于3D打印、快速原型制作,或作为型材的"外壳"参考模型。
截面形状验证 通过外皮模型的可视化效果,验证型材的截面外边线是否正确提取。如果外皮不贴合型材边界,可能意味着截面数据有问题。
属性降级使用 当型材不包含LK标准属性时,组件不会崩溃,而是直接输出原物件。这使得该组件可以安全地插入到任意Brep处理流程中——有属性就做外皮,没有属性就直通。

⚠️ 注意事项

📋 组件信息

名称型材表皮
英文名PS
分类LK → Util
Exposurequinary(五级)
基类GH_Component(无按钮)
文件ProfileSurface.cs
GUID{E7542291-5449-41EE-AE7B-77B9C9E9D1BF}