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
相关产品推荐
相关产品推荐

