【Grasshopper基础10】GH_Attribute简介 —— 自定义电池样式的终极后台

本文介绍了Grasshopper中如何通过继承GH_ComponentAttributes并重写Render方法来自定义电池外观。通过理解GH_Attribute<T>类及其属性和方法,如Pivot、Bounds、DocObject、RenderToCanvas等,可以实现电池的个性化设计。文章还提供了代码示例,展示了如何创建一个圆形电池并根据选中状态改变颜色。

距离上次的【基础9】已经过去了又有差不多1个月了,工作上的事情越来越多,能抽出空来(主要是要找到“有空并且有舒适的心情来写”的时间挺难的…)的时间也变少了。笔者最近在做的工作跟Grasshopper本身也没有特别多的联系,但是对于Grasshopper的兴趣还是依然存在,这也是笔者能够一直坚持这个系列创作的最重要的原因吧,希望平日大家在设计工作之余,也能做出更多好玩有意思的东西来。

好了,闲话少说,【基础1~9】基本上可以算是把GH_Component这个类能做的所有事情都囊括了进去,这其中包括了数据的类型、数据的传递和处理、电池输入输出变量的动态变更,以及自定义鼠标右键菜单的构造等。更复杂的东西,GH_Component就无法胜任了,需要借助到其他的类了。

在整个Grasshopper电池的制作过程当中,大家一定会有一个疑问,电池在画布上为什么会长成一个圆角长方形的样子,上面为什么又可以根据电池的名字出现相应的文字,如果我想要让自己的电池长成另外的样子行不行?这一切的问题答案都源自于一个类:

GH_Attribute<T>

它是决定电池长相以及交互的类。一切有关于电池的前端都由它来负责。由于它所要处理的事务特别多、也特别琐碎,不可能用一篇文章介绍完毕,接下来的若干篇文章都会围绕它来展开。

今天作为【基础】的第10篇,正好凑个整,就先来总体介绍一下GH_Attribute<T>这个类包含哪些可以为我们所用的函数(常用的),每个函数又大致是什么样的功能吧。不过在具体介绍之前,我们还是先来总结一下GH_Attribute<T>与其他我们已经介绍过的类是什么样一种关系。



TL, DR :
实现自定义电池外观最快的办法:

  • 继承GH_ComponentAttribute
  • 重写Render函数。

详见最后代码



GH_Attribute<T>GH_Component

首先明确一点,GH_Attribute<T>服务对象不仅仅限于GH_Component

我们已经知道GH_ComponentGH_DocumentObject的子类,所有在Grasshopper上出现的东西(包括电池、各种奇奇怪怪的按钮等等)都是派生自GH_DocumentObject的。而每一个GH_DocumentObject类中会有一个属性是GH_Attribute<T>,也就是说,

  • 每一个GH_DocumentObject对应一个GH_Attribute<T>
  • GH_DocumentObject负责处理业务逻辑,其包含如何运作数据等
  • GH_Attribute<T>负责处理前端逻辑,其包含电池应该长什么样,怎么相应鼠标事件等

这俩都是抽象类,不能直接创作实例,因为它们俩本身都不是真正能够给用户提供功能的类。

就像“我们平时用的是GH_Component而不是GH_DocumentObject”一样,GH_Attribute<T>不是能够直接使用的。

GH_Component对应的是GH_ComponentAttributes类,它是GH_Attribute<T>的子类,其中泛型T对应的类型这里是IGH_Component。也就是这个类是针对于GH_Component所特有的。

FlowChart_202104211358

下面是重点:

我们如果想要自定义电池的外观,最简单、直观的方法是创作一个类,继承自GH_ComponentAttributes类。

既然GH_ComponentAttributes是继承自GH_Attribute<T>的类,我们通过详细了解GH_Attribute<T>这个类,自然也了解了如何实现自定义电池外观了。


GH_Attribute<T>所实现的接口类

整个Grasshopper的架构几乎都是基于接口构建的,所以GH_Attribute<T>本质上也只是一个实现了IGH_Attribute的接口类,了解了接口需要实现什么样的函数,也就了解了GH_Attribute<T>的本质了。

IGH_Attribute接口类所需要实现的内容有:

  • Pivot 属性
    • PointF 类型
    • 用于定义电池在Grasshopper上的挂载点,也就是“位于Grasshopper画布上具体哪个坐标点”
    • 改变Pivot坐标等价于移动电池在画布上的位置
  • Bounds 属性
    • RectangleF 类型
    • 用于定义电池在Grasshopper上的绘制范围,也就是电池所在的长方形大小的具体长、宽信息
    • 这个类型里附带XY属性,但是GH并不会读取它们,有用的是WidthHeight属性
  • DocObject 属性
    • IGH_DocumentObject 类型
    • 用于获取与之“一对一”对应的GH_DocumentObject实例
  • Selected属性
    • bool类型
    • 顾名思义,是用来保存该电池是否被选中的一个状态量(选中的电池呈绿色)
  • IsPickRegion 方法
    • 主要是用来确定给定点是否在电池的Bounds范围内
    • 用于触发鼠标事件等
  • PerformLayout 方法
    • 用来根据其他数据(比如电池的输入/输出端参数个数)来修正Bounds或者其他与电池外观相关的参数
    • 该方法会在最终绘制之前运行,用来“准备电池外观”
  • RenderToCanvas 方法
    • 重点
    • 由该方法最终决定电池在画布上的外观
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值