距离上次的【基础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_Component是GH_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所特有的。

下面是重点:
我们如果想要自定义电池的外观,最简单、直观的方法是创作一个类,继承自
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上的绘制范围,也就是电池所在的长方形大小的具体长、宽信息
- 这个类型里附带
X和Y属性,但是GH并不会读取它们,有用的是Width和Height属性
DocObject属性IGH_DocumentObject类型- 用于获取与之“一对一”对应的
GH_DocumentObject实例
Selected属性bool类型- 顾名思义,是用来保存该电池是否被选中的一个状态量(选中的电池呈绿色)
IsPickRegion方法- 主要是用来确定给定点是否在电池的
Bounds范围内 - 用于触发鼠标事件等
- 主要是用来确定给定点是否在电池的
PerformLayout方法- 用来根据其他数据(比如电池的输入/输出端参数个数)来修正
Bounds或者其他与电池外观相关的参数 - 该方法会在最终绘制之前运行,用来“准备电池外观”
- 用来根据其他数据(比如电池的输入/输出端参数个数)来修正
RenderToCanvas方法- 重点
- 由该方法最终决定电池在画布上的外观

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





