型材长度 型材长度 · L

计算LK系统创建的型材模型长度,支持直线型材和弯曲型材两种模式,可将长度一键存储至Rhino物件属性中
📂 LK → Util 📄 BrepLength.cs 🔘 按钮触发 📐 弯曲型材

📖 功能概述

该组件专为LK系统创建的型材模型设计,提供精确的长度测量。组件根据型材路径的几何特性自动判断使用直线模式还是弯曲模式:

内置布尔按钮,触发后可将计算结果写入Rhino物件的UserDictionary(键名:L),方便后续BOM清单自动提取。

📥 输入参数

名称类型必填说明
型材模型 Brep 必填 需要计算长度的型材模型。必须是由LK系统创建、包含标准属性的模型(pln、拉伸-路径、拉伸-截面、拉伸-截面pln、起端切面、终端切面)。
存储 Boolean 可选 设为 True 触发长度存储操作,将计算得到的长度写入Rhino物件属性。也可通过组件内置按钮代替。默认值为 False。

📤 输出参数

名称类型说明
长度 Number 计算得到的型材长度值,保留一位小数。单位与模型单位一致(通常为mm)。
边界线 Curve 仅弯曲型材模式输出。切割后边界框的最长边线,代表型材的有效长度基准线,可用于后续的加工定位。
边界框 Brep 仅弯曲型材模式输出。切割后的弯曲边界框实体,是截面外围沿路径扫掠后经端部切割的纯净实体。

🧠 核心算法详解

模式一:直线型材长度计算

适用条件:型材的拉伸路径(rail)为直线(通过 IsLinear(1) 判断)。

计算流程:
1 从Rhino物件属性中读取局部坐标平面(pln)
2 使用 BoundingBoxCalculator 在局部坐标系中计算型材模型的边界框
3 读取边界框的 X 轴长度 —— 在LK系统中,型材的局部坐标 X 方向即为主方向(长度方向)
4 结果四舍五入保留一位小数

特点:计算量小,速度快,适用于所有直线型材。

模式二:弯曲型材长度计算

这是该组件的核心复杂度所在。弯曲型材无法像直线型材那样直接读取边界框长度,因为其主方向不再与单一坐标轴对齐。组件采用"截面外轮廓→扫掠重建→切割面分析→提取最长边"的链路完成计算。

Step 1 —— 截面外矩形提取
从型材属性中读取截面(拉伸-截面)和截面平面(拉伸-截面pln)。使用 BoundingBoxCalculator.ToBoundingRectangle() 计算截面在截面平面上的外包围矩形。
为什么用外矩形? 弯曲型材的截面本身可能有复杂的开孔和异形轮廓,但长度只取决于外轮廓的最外边界,所以取外矩形作为扫掠截面即可。

Step 2 —— 沿路径扫掠生成实体
将外矩形转换为平面Brep,使用 SuperExtrude 沿型材的拉伸路径(rail)进行扫掠,生成一个纯净的弯曲管状实体(不含内部任何开孔),然后执行 CapPlanarHoles 封闭端面。
注意: 这个实体还没有经过端部切割,是一个完整的沿路径扫掠体。

Step 3 —— 端部切割面提取
从属性中读取起端切面(起端切面)和终端切面(终端切面)。这些切面代表了型材两端实际被铣切后的端面位置。

Step 4 —— 相交分析(BrepIntersectionAnalyzer)
这是最关键的步骤。使用 BrepIntersectionAnalyzer 对扫掠实体与两个切割面进行相交分析:
通过 Intersection.BrepBrep 计算扫掠实体与切割面的相交曲线
对相交曲线进行递归分解:处理 PolyCurve → 段、PolylineCurve → 线段、NurbsCurve → 按连续断开
提取所有曲线段的端点,投影到路径曲线
将投影点按路径参数排序,取首尾两端作为有效长度的端点
在两个端点处的路径曲线上创建垂直平面(PerpendicularFrame)—— 这就是实际切割平面的位置
Step 5 —— 平行布尔切割
使用 ParallelBrepBooleanDifference 用Step 4得到的两个垂直平面对扫掠实体进行切割,得到最终的切割后实体。

Step 6 —— 最长边提取
从切割后实体的所有边线中,按长度排序选出最长的一条作为型材的有效长度基准线。这条边线通常位于型材的一侧外缘。同时输出切割后实体供检查。

特点:精确度高,适用于任意弯曲路径;涉及BrepBrep相交和布尔运算,计算量较大。

⚙️ 完整执行流程

1
读取输入
型材模型
2
校验LK
标准属性
3
判断路径
是否直线
4
直线模式
或弯曲模式
5
输出长度
边界线/框
6
可选:
存储到属性
详细步骤:

1. 数据获取:从DA获取输入Brep和布尔值。如果Brep为空则退出。
2. 属性校验:通过ReferenceID找到Rhino场景中的物件,检查其UserDictionary是否包含以下键名:pln拉伸-路径拉伸-截面拉伸-截面pln起端切面终端切面。缺少任何一个则报错"模型不符合LK系统要求"。
3. 模式判断:读取拉伸路径(rail),通过 IsLinear(1) 判断路径是否为直线。根据结果选择直线模式或弯曲模式执行。
4. 计算执行:按照上述算法执行对应的长度计算。
5. 结果输出:长度值始终输出;弯曲模式额外输出基准边线和切割后实体。
6. 存储操作:如果布尔输入为True或内置按钮被点击,将长度值通过 SetUserKey.Key 写入Rhino物件的UserDictionary,键名 L

🧪 典型使用场景

场景详细说明
直线型材批量测长 在Grasshopper中批量输入多个直线型材,快速获取每个型材的长度,用于BOM清单统计或材料核算。
弯曲型材弧长测量 对于弧形或异形路径的弯曲型材,通过扫掠重建 + 切割面分析精确计算有效弧长,配合输出的基准线进行后续加工定位。
长度值存储 在计算得到满意的长度后,点击内置按钮或输入True触发存储,将长度值写入Rhino物件属性,方便后续通过其他组件读取、导出到Excel或用于自动化加工流程。
长度基准线提取 弯曲型材模式下,输出的边界线(最长边线)可作为后续加工或装配定位的基准线,用于CAM路径规划。

🔧 辅助类:BrepIntersectionAnalyzer

这个内部类是弯曲型材长度计算的核心。它专门用于分析扫掠实体与切割面之间的相交关系,确定切割平面的精确位置。

构造函数:
接收三个参数:扫掠实体(Brep A)、切割面列表(List<Brep>)、路径曲线(rail)。

Analyze() 方法完整流程:
1 计算相交曲线:对每个切割面,调用 Intersection.BrepBrep(扫掠体, 切割面),获取两者之间的所有相交曲线。
2 曲线段分解:通过递归的 CurveSegments 方法将复杂的相交曲线分解为基本段(LineCurve、ArcCurve等),确保后续角点提取精确。
分解逻辑: PolyCurve → explode分段迭代、PolylineCurve → 逐段拆为LineCurve、NurbsCurve → 按G1不连续点断开。
3 角点收集:从所有分解后的曲线段中提取端点(首端点+所有末端点),这些点代表切割面与扫掠体的接触边界。
4 投影到路径:将所有角点投影到路径曲线(rail)上,找到它们在路径上的最近点。
5 确定端点:在投影点中,按路径参数(t值)排序,取t值最小和最大的两个点,分别为切割的起始端和终止端。
6 创建垂直平面:在两个端点处的路径上创建垂直平面(PerpendicularFrame),以此作为后续布尔切割的切割平面。
注意:终端平面的Y轴被反转(-YAxis),以符合布尔运算的方向要求。

该类的输出是一个 AnalysisResult 对象,包含相交曲线、角点、投影点、端点、切割平面等所有中间数据,但组件最终只使用 NormalPlanes(两个切割平面)。

⚠️ 注意事项

📋 组件信息

名称型材长度
英文名L
分类LK → Util
Exposurequinary(五级,搜索时较少显示)
显示文本L存储(按钮上显示的文本)
基类BoolButtonComponent
文件BrepLength.cs
GUID{12DB59F9-BF45-4809-8FD7-0909D7F8E0E2}