Grasshopper C#组件中自定义类调用Rhino方法的问题
Grasshopper C#组件自定义类调用Rhino/Grasshopper方法报错解决方案
报错原因
Print是Grasshopper脚本实例Script_Instance的非静态成员,自定义类作为嵌套类无法直接访问外部类的非静态成员;doc.Objects.AddSurface同理,doc是脚本实例的成员,也不能在自定义类中直接调用。
解决方法一:传递外部实例引用
给自定义类的构造函数传入脚本实例或RhinoDoc对象,通过引用调用对应方法:
public class MyClass { private readonly Script_Instance _script; private readonly RhinoDoc _rhinoDoc; // 构造函数接收外部实例 public MyClass(Script_Instance script, RhinoDoc rhinoDoc) { _script = script; _rhinoDoc = rhinoDoc; } public void TestFoo() { // 通过脚本实例调用Print _script.Print("it works!"); } public void AddNurbsSurface(NurbsSurface surface) { if (surface != null && surface.IsValid) { _rhinoDoc.Objects.AddSurface(surface); _rhinoDoc.Views.Redraw(); } } } // 脚本主逻辑中实例化,传入当前脚本实例和激活的Rhino文档 var myObj = new MyClass(this, RhinoDoc.ActiveDoc); myObj.TestFoo(); // 示例创建并添加Nurbs曲面 var plane = Plane.WorldXY; var nurbsSurface = NurbsSurface.CreateFromCorners( plane, new Point3d(0, 0, 0), new Point3d(10, 0, 0), new Point3d(0, 10, 0), new Point3d(10, 10, 5) ); myObj.AddNurbsSurface(nurbsSurface);
解决方法二:使用静态替代方法
如果不需要和脚本组件深度交互,可以用Rhino提供的静态方法替代:
- 用
Rhino.RhinoApp.WriteLine()替代Print,两者都能输出信息到Rhino命令行 - 直接使用静态的
RhinoDoc.ActiveDoc访问当前激活文档
public class MyClass { public void TestFoo() { // 静态方法可直接调用 Rhino.RhinoApp.WriteLine("it works!"); } public void AddNurbsSurface(NurbsSurface surface) { if (surface != null && surface.IsValid) { RhinoDoc.ActiveDoc.Objects.AddSurface(surface); RhinoDoc.ActiveDoc.Views.Redraw(); } } } // 直接实例化调用 var myObj = new MyClass(); myObj.TestFoo();
方法选择
- 方法一适合需要使用脚本组件其他成员(如输入输出参数)的场景,耦合性更强但交互性更好
- 方法二更简洁,适合仅需基础Rhino功能的场景,耦合性低
内容的提问来源于stack exchange,提问作者Александр Миллер
相关产品推荐
相关产品推荐

