在RegisterInputParams和RegisterOutputParames中添加数据的输入端/输出端之后的下一步就是我们如何在电池的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方法,并提供一些包含数据验证、迭代器、隐式类型转换等等功能。下面是上面各个类的关系图

于是,观察这个接口类会发现如下的一些方法
- GetData
- GetDataList
- GetDataTree
- SetData
- SetDataList
- SetDataTree
这些函数分别对应的就是以不同的方式获取电池输入/输出参数中的数据。值得注意点是,使用的获取数据以及给参数赋值的方法必须与之前参数的A

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

被折叠的 条评论
为什么被折叠?



