You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Александр Миллер

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:50:23