【Grasshopper基础13】创建可在画布上自由传递的自定义类型数据(上)—— IGH_Goo接口的重要性及其实现

本文探讨了Grasshopper中的特殊电池——带黑底的自定义数据类型(IGH_Goo接口),它们确保数据在GH画布中的安全传递,防止复制粘贴和文件操作时的数据丢失。理解序列化/反序列化原理并实现IGH_Goo至关重要。

接下来的两章,我们来介绍一下在之前章节尚未介绍到的,但却在Grasshopper中占据极其重要地位的另一批我们早就虎视眈眈但却还没想到理由要去触碰的电池们(左侧红色框指示):

Snipaste_2022-02-09_11-40-22
是的,就是这一些带黑底的电池们

经过仔细思考,笔者还是决定将该部分内容拆分为上下两篇。

  • 上篇主要讲为什么要存在自定义类型数据,IGH_Goo接口对于我们日常使用 Rhino + Grasshopper 这两个工具而言,到底解决了什么问题。
  • 下篇则是直接介绍如何制作一个自己的数据类型来实现这个接口,并且借助 Grasshopper 的一些基础类,来完成对这个自定义数据类型的一些简单电池的封装,以及如何结合我们之前学习的 GH_Component 电池来完成特定的场景,包括不限于:
    • 自定义数据类型电池
    • 制定隐式数据转换规则(从string读取数据转换为自己的类型)
    • 内嵌至 GH_Component 中实现自定义类型的隐式转换

好了,下面就正式开始我们的上篇!


正如我们在前文中提到的,这些带黑底电池与其他电池不同有着明显的不同:其他电池有入口出口的详细说明文字,但这些电池却仅仅提供了出入口,似乎没有说明一般。

我们对它们的使用也有着明显的风格区别:平时我们最多的用途就是用它们来 拾取Rhino中既有的几何物件,亦或是只用它们来做数据的中转站,让电池之间的连线不至于那么长。

事实上,它们都没有数据处理功能,说的更具体一点,这些电池中,没有类似于我们之前写的电池的 SolveInstance 的功能。

“那它有个锤子用?”

啊这… 存储数据本身就是一个很重要的功能,比如说笔者最喜欢的一个功能就是在Rhino中拾取曲线之后,通过右键菜单中的 Internalize 选项,将这个拾取的曲线的数据与Rhino数据断开连接,这样这样我们把这个 .gh 文件发送给别人进行分享的时候,无需附带原来的Rhino的 .3dm 文件,其他人就可以看到这条曲线了。

Snipaste_2022-02-09_11-55-39

也就是说,这些电池的最重要的功能就是 存储数据至 .gh 文件中

我们都知道,Grasshopper是“参数化”建模工具,但是这个参数化最初还是需要几个既定的基点的,也就是说,Grasshopper的数据流总归是需要一个 数据起点。而这帮子黑乎乎的电池就充当了这样一个重任 —— 将数据的起点能够保存到 .gh 文件中,让文件在分享过程中,数据不至于丢失。


IGH_Goo 的作用

要实现数据保存至 .gh 文件中,必须 实现 IGH_Goo 接口。且只有实现了这个接口的数据,才能在Grasshopper画布里的电池之间进行数据传递时,不出现奇奇怪怪的问题。

有人肯定会提出反对意见:

明明在Grasshopper中,我自己任意定义一个class,也可以实现这个数据类型的传递呀,不会出现任何问题。

并且可以给出代码:

// 一个简单的L型钢定义
public class LSection
{
   
   
    public double Width {
   
    get; set; }
    public double Height {
   
    get; set; }
    public double Thickness {
   
    get; set; }

    public LSection(double w, double h, double t)
    {
   
   
        if (w > h) // 一个简单的判断,让width永远大于height,方便操作。
        {
   
   
            Width = w; Height = h; Thickness = t;
        }
        else
        {
   
   
            Width = h; Height = w; Thickness = t;
        }
    }

    public bool IsEqualLeg => Width == Height;

    // 重写ToString方法,在连接到Panel电池时可直接获取其数据。
    public override string ToString()
    {
   
   
        return $"L-Shaped Section:{
     
     Width}x{
     
     Height}x{
     
     Thickness}";
    }
}

// 制作L型钢的电池
public class CreateLShapedSection : GH_Component
{
   
   
    public CreateLShapedSection() :
        base("Create L Section", "L Section", "Description", "Params", "DigitalCrab") {
   
    }
    static Guid _cid = Guid.Parse("{8C0B597B-00F1-4C0F-9B8A-E5A2B740C912}");
    public override Guid ComponentGuid => _cid;
    protected override void RegisterInputParams(GH_InputParamManager pManager)
    {
   
   
        pManager.AddNumberParameter("Width", "W", "", GH_ParamAccess.item);
        pManager.AddNumberParameter("Height", "H", "", GH_ParamAccess.item);
        pManager.AddNumberParameter("Thickness", "T", "", GH_ParamAccess.item);
    }

    protected override void RegisterOutputParams(GH_OutputParamManager pManager)
    {
   
   
        pManager.AddGenericParameter("L型钢截面", "L", "", GH_ParamAccess.item);
    }

    protected override void SolveInstance(IGH_DataAccess DA)
    {
   
   
        var w = 0.0; var h = 0.0; var t = 0.0;
        if (!DA.GetData(0, ref w) || 
            !DA.GetData(1, ref h) || 
            !DA.GetData(2, ref t))
            return;

        DA.SetData(0, new LSection(w, h, t));
    }
}
</
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值