====== 08 自定义端点与插件扩展 ======
===== 为什么要扩展 Compute =====
默认 Compute 暴露了大量 RhinoCommon 相关端点,也支持 Grasshopper 求解。但有些业务更适合自定义端点:
* 需要把多个 RhinoCommon 调用封装成一个稳定业务 API。
* 需要隐藏复杂参数,给客户端提供简单接口。
* 需要复用公司内部 Rhino 插件算法。
* 需要减少客户端和服务端之间的大量往返。
* 需要把几何运算和业务约束放在服务端统一维护。
===== 扩展方式 =====
官方方式是在 Rhino 插件中注册 Compute 端点:
- 在插件项目中定义静态类。
- 在静态类中定义 public static 方法。
- 在插件 ''OnLoad'' 中调用 ''Rhino.Runtime.HostUtils.RegisterComputeEndPoint''。
- 在本地 Rhino 和 Compute 服务器上安装该插件。
- 打开 ''/sdk'' 检查新端点是否出现。
===== 简化示例 =====
using Rhino;
using Rhino.Geometry;
using Rhino.PlugIns;
static class MyCustomComputeFunctions
{
public static double Add(double x, double y, double z)
{
return x + y + z;
}
public static double AdjustedArea(Curve curve, double factor)
{
var amp = AreaMassProperties.Compute(curve);
return amp.Area * factor;
}
}
public class MyPlugin : PlugIn
{
protected override LoadReturnCode OnLoad(ref string errorMessage)
{
Rhino.Runtime.HostUtils.RegisterComputeEndPoint(
"Rhino.CustomEndPoint",
typeof(MyCustomComputeFunctions)
);
return base.OnLoad(ref errorMessage);
}
}
注册后,访问:
http://localhost:6500/sdk
如果插件加载成功,应能在 SDK 页面看到自定义函数。
===== DWG base64 场景 =====
如果业务系统通过 base64 上传 DWG,不建议把完整 base64 字符串直接接入 Grasshopper/Hops 画布。更稳妥的做法是先用自定义 Compute 插件端点接收、校验、解码、落盘并导入 DWG,再把 ''job_id''、''3dm_path''、图层摘要或几何结果交给 Grasshopper 自定义电池继续处理。
详细方案见:
* [[11_dwg_base64_plugin_hops_solution|11 DWG Base64 与自定义插件/Hops 集成方案]]
===== 方法设计原则 =====
* 方法应是 ''public static'',输入输出类型应能被 Compute 序列化。
* 不要依赖当前 Rhino 窗口、视口、鼠标选择、命令行交互。
* 不要在方法内部保存跨请求的可变全局状态。
* 输入参数要小而明确,复杂请求使用专门 DTO。
* 输出结果要可预测,错误要抛出清晰异常或返回结构化错误。
* 对大几何、大文件、外部 URL 要做大小和来源校验。
===== 插件部署注意事项 =====
服务器上的 Compute 子进程是无界面 Rhino 环境。插件能在普通 Rhino 中运行,不代表一定能在 Compute 中稳定运行。
需要检查:
* 插件是否安装到服务器 Rhino 可发现的位置。
* 插件是否支持当前 Rhino 版本。
* 插件是否依赖 UI、弹窗、命令行输入或用户选择。
* 插件是否有单独授权机制,服务器上是否已授权。
* 插件依赖的 DLL、配置文件、模板、数据文件是否存在。
* 插件首次加载是否需要人工确认。
===== 调试流程 =====
- 在普通 Rhino 中安装插件并确认可加载。
- 在普通 Rhino 中手动运行插件核心命令或测试方法。
- 启动本地 Compute。
- 访问 ''/sdk'',确认自定义端点出现。
- 用最小请求调用端点。
- 再接入业务客户端或 Hops。
- 最后部署到 IIS 生产环境。
===== 与 Grasshopper 的取舍 =====
^ 方案 ^ 优点 ^ 风险 ^
| Grasshopper/Hops | 设计人员容易维护;可视化;快速迭代。 | 复杂定义可维护性下降;插件依赖多;序列化开销大。 |
| 自定义 Compute 端点 | API 稳定;性能可控;易测试;适合工程化。 | 需要 C# 插件开发能力;部署和版本管理更严格。 |
实践建议:
* 早期方案验证可以用 Hops。
* 稳定、高频、性能敏感的核心算法逐步下沉为自定义端点。
* 保留 Hops 给设计师迭代,把生产业务 API 交给自定义端点或外层服务。
===== 测试建议 =====
* 为插件核心算法写普通 .NET 单元测试。
* 为 Compute 端点写集成测试,真实启动 Compute 调用 HTTP。
* 测试空输入、非法几何、巨大几何、单位差异、异常路径。
* 每次 Rhino 或插件升级后,重新跑一遍端点集成测试。
===== 本章检查点 =====
* 自定义函数是否为可序列化的静态方法?
* 插件是否能在无界面 Compute 环境中加载?
* ''/sdk'' 是否能看到自定义端点?
* 是否为端点准备了最小 HTTP 集成测试?
===== 参考资料 =====
* [[https://developer.rhino3d.com/guides/compute/custom-endpoints/|Extending Compute with Custom Endpoints]]
* [[https://developer.rhino3d.com/en/guides/compute/development/|Running and Debugging Compute Locally]]