🧠 核心算法详解
一、路径决策逻辑
1 尝试从输入2(路径参数)读取用户指定的文件夹路径
2 如果用户未输入路径,自动生成:
桌面\STP导出{当前日期yyyyMMdd}
3 检查生成的路径是否已存在,不存在则自动创建目录
4 读取模型的"编号"属性,拼装完整文件路径:
{路径}\{编号}.stp
5 无论是否触发导出,优先输出文件路径到输出参数——这让用户可以在触发导出前预览路径是否正确
二、属性校验
导出前检查模型物件的UserDictionary是否包含以下必要键名:
pln (模型局部坐标平面)
编号 (模型编号,用作STP文件名)
缺少任一项则报错"模型不符合LK系统要求"并中断执行。
三、触发判断与导出执行
1 触发判断:检查布尔输入是否为True,或者内置按钮是否被按下。只有满足任一条件才继续导出。
2 模型归零:从属性中读取局部坐标平面(pln),构造 Transform.PlaneToPlane(pln, WorldXY) 变换矩阵,将模型副本平移到世界坐标系原点。这样导出的STP在其他3D软件中打开时位于原点附近,便于后续处理。
3 临时烘焙:将归零后的模型副本以临时物件形式添加到Rhino场景中(保持与原模型相同的图层索引)。这一步骤是因为Rhino的STP导出命令是基于当前场景中选择的物件,无法直接导出Grasshopper中的抽象Brep。
4 视口优化:临时禁用视图刷新(RedrawEnabled = false)以提高导出性能;清空当前选择,选中刚烘焙的模型;缩放视口到选中范围,确保命令操作准确。
5 执行导出命令:通过 RhinoApp.RunScript 执行 Rhino 内置的 -Export 命令,参数为目标文件路径。使用 _Enter 确认命令,echo: false 抑制命令回显。
6 清理收尾:在 finally 块中确保:删除烘焙的临时物件、取消所有选择、重新启用视图刷新。无论导出成功还是异常,这一步都会执行,确保场景不被污染。
⚙️ 完整执行流程
1. 读取数据:从DA获取模型(GH_Brep)、路径(string)、触发(bool)三个参数。
2. 路径处理:如果路径为空,自动在桌面创建"STP导出YYYYMMDD"文件夹;确保目录存在。
3. 属性校验:通过ReferenceID定位Rhino场景物件,检查pln和编号属性是否存在。不存在则报错退出。
4. 路径输出:拼接完整文件路径 {路径}\{编号}.stp 并输出到第一个参数。此时用户可以看到即将导出的位置。
5. 触发判断:如果未触发(布尔=False且按钮未按下)则在此结束,不执行后续导出操作。
6. 导出执行:
a. 读取pln,构造平面到平面的变换
b. 复制模型并应用变换(归零)
c. 禁用视图刷新,烘焙模型副本到场景
d. 选中烘焙物件,缩放到选中范围
e. 运行 Rhino -Export 命令
f. 等待命令完成(RhinoApp.Wait)
g. 删除临时物件,启用视图刷新