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

Visual Studio中C#开发Grasshopper组件:动态设置输入参数可选性

实现方法

Grasshopper的参数Optional属性属于静态初始化属性,无法在组件运行时直接根据其他参数的输入动态修改,因此需要通过输入校验逻辑或UI状态动态刷新来实现需求:

基础实现:通过SolveInstance做动态校验

这种方式简单直接,核心是在组件执行逻辑时,根据参数A的值判断是否强制校验参数B的输入:

1. 初始化参数时将B设为可选

先在RegisterInputParams方法里把参数B设为可选,确保默认状态下组件不会强制要求输入B:

protected override void RegisterInputParams(GH_InputParamManager pManager)
{
    pManager.AddIntegerParameter("A", "A", "description", GH_ParamAccess.item);
    // 初始化时将B设为可选
    var paramB = pManager.AddTextParameter("B", "B", "description", GH_ParamAccess.item);
    paramB.Optional = true;
}

2. 在SolveInstance中添加校验逻辑

在组件的SolveInstance方法里,先获取参数A的值,再根据取值判断是否需要强制校验参数B:

protected override void SolveInstance(IGH_DataAccess DA)
{
    int A = 0;
    string B = null;

    // 先获取参数A的值,失败则直接返回
    if (!DA.GetData(0, ref A)) return;

    // 根据A的取值处理参数B
    if (A == 1)
    {
        // 当A=1时,强制要求输入B,未输入则抛出错误提示
        if (!DA.GetData(1, ref B))
        {
            AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "当A=1时,参数B为必填项");
            return;
        }
    }
    else if (A == 0)
    {
        // 当A=0时,可选获取B的值,即使未输入也不报错
        DA.GetData(1, ref B);
    }

    // 后续业务逻辑编写
    // ...
}

进阶实现:动态更新UI状态

如果希望在Grasshopper界面上直观体现B的必填状态(比如A=1时B的输入框显示为必填样式),可以重写BeforeSolveInstance方法,实时刷新参数的Optional属性:

public override void BeforeSolveInstance()
{
    base.BeforeSolveInstance();
    
    int A = 0;
    // 尝试获取参数A的当前输入值
    if (Params.Input[0].SourceCount > 0)
    {
        var dataBranch = Params.Input[0].VolatileData.get_Branch(0);
        if (dataBranch.Count > 0)
        {
            A = (int)dataBranch[0];
        }
    }
    
    // 根据A的值动态设置B的可选状态
    Params.Input[1].Optional = A != 1;
    // 触发组件UI刷新,让状态变更生效
    OnDisplayExpired(true);
}

内容的提问来源于stack exchange,提问作者Abba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:09