【Grasshopper基础3】在SolveInstance中获取数据和传出数据

本文围绕Grasshopper展开,介绍了在电池中获取和处理数据的方法。认识了IGH_DataAccess接口类,它是实现电池内部逻辑与数据交互的核心。还阐述了GH中的隐式类型转换,包括输入/输出参数层面和参数拆箱层面,以及相关注意事项。

RegisterInputParamsRegisterOutputParames中添加数据的输入端/输出端之后的下一步就是我们如何在电池的SolveInstance中拿到我们的数据并进一步处理了。

我们先来看看SolveInstance方法重写(override)时的方法定义

protected override void SolveInstance(IGH_DataAccess DA) {
   
    }

方法的传入参数为IGH_DataAccess接口类,返回类型void。当看到返回类型是void时我们就想到了,电池的计算结果肯定不是直接通过这个方法本身返回的,而是在方法内通过某种方式将数据传递出去。那么,这个传入的IGH_DataAccess接口类就应该是实现电池内部逻辑与数据的交互的核心了。


认识IGH_DataAccess

正如它的名字一般,IGH_DataAccess是一个用来从GH_Structure中获取数据的一个接口类。

回忆一下我们在C#中创建自定义类的时候如果要创建一个属性,我们常常会定义一个非公开变量用来存储这个属性值,并实现一个setter方法和getter方法来提供对这个私有变量的值的设置和获取,如下例所示

class MyCustomizedClass
{
   
   
    private string _name;
    public string Name => _name;
    public void SetName(string name) => _name = name;
}

相较于直接把属于类实例的变量 _name 直接设置成为公开,上面的处理方式可以在设置变量值的时候对该变量的值进行验证,比如上述方法中就可以直接对字符串的长度进行一个简单的验证:

public void SetName(string name) 
{
   
   
    if (name.Length > 0) _name = name;
    else throw new ArgumentException("名字不能为空");
}

在Grasshopper中也是类似的,每个继承自GH_Component的电池都将内部的数据都是交由注册在电池上的参数实例 GH_Params 来管理的。参数实例把数据封包起来(底层对数据封装的实例为GH_Structure<T>),并将自己挂载在电池数据管理类GH_ComponentParamServer中,由电池内部的一个迭代器继承IGH_DataAccess接口类提供数据的setter方法和getter方法,并提供一些包含数据验证、迭代器、隐式类型转换等等功能。下面是上面各个类的关系图

WeChat Screenshot_20210113152629

于是,观察这个接口类会发现如下的一些方法

  • GetData
  • GetDataList
  • GetDataTree
  • SetData
  • SetDataList
  • SetDataTree

这些函数分别对应的就是以不同的方式获取电池输入/输出参数中的数据。值得注意点是,使用的获取数据以及给参数赋值的方法必须与之前参数的A

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值