作者:“咕咕咕?下一篇马上就写好了”
通过上一篇【基础10】的文章,大家已经了解到一个GH电池在画布上的样式是由其背后的 GH_Attribute 类实例来决定的,而大部分的GH电池都使用了它的一个派生类 GH_ComponentAttribute 来配置电池的外观。今天我们就继续上一篇的内容,通过它来给我们的电池配置一个按钮,当我们的按钮被按下去的时候,可以切换我们今天例子中电池的工作模式。
首先我们来介绍一下今天的例子,它将会是一个简单的求 某个数的平方根 的电池:
public class SqrtRootPosNeg : GH_Component
{
public SqrtRootPosNeg()
: base("SqrtRootPosNeg", "SRPN",
"Description",
"Params", "DigitalCrab") {
}
protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
{
pManager.AddNumberParameter("A", "A", "", GH_ParamAccess.item);
}
protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
{
pManager.AddNumberParameter("A", "A", "", GH_ParamAccess.item);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
double a = 0.0;
if (!DA.GetData(0, ref a)) return;
DA.SetData(0, Math.Sqrt(a));
}
protected override System.Drawing.Bitmap Icon => null;
public override Guid ComponentGuid => Guid.Parse("请替换成自己生成的GUID");
}
从代码上也能看出来这是个十分简单的电池,仅有一个输入和一个输出,SolveInstance的过程也只是将输入的double变量直接求算术平方根。

但是,一个数的平方根有两个,一个是正数,一个负数,Math.Sqrt()函数给出的只是那个正的平方根,我们接下来就做一个电池,让这个电池上面有一个按钮,点一下之后,这个电池就能输出负的平方根,再点一下就切换回来输出正的平方根。简而言之,就是使用一个在电池上的按钮来切换电池的工作形态。
定义电池的工作形态
要让电池实现两种不同的工作模式,那必然是要在电池类上添加一个表达电池当前 状态 的某种“变量”,然后我们通过按钮来改变这个“变量”的值,就可以实现电池的工作状态切换了。
最简单的方式当然是给电池一个bool属性,true的时候输出正平方根,false的时候输出负平方根。但是嘛,bool值毕竟不太直观,直接上个enum,增强可阅读性。
那么,电池的非UI部分的主要逻辑(关于数据处理的逻辑)就完成了:
public class SqrtRootPosNeg : GH_Component
{
public enum SqrtMode {
Positive, Negative } /* 定义一个enum类型 */
public SqrtMode CompWorkMode {
get; set; } = SqrtMode.Positive; /* 使用这个enum类型来定义一个代表电池工作状态的变量 */
/* 修改电池的SolveInstance逻辑,引入对电池工作状态的判断 */
protected override void SolveInstance(IGH_DataAccess DA)
{
double a = 0.0;
if (!DA.GetData(0, ref a)) return;
if (CompWorkMode == SqrtMode.Positive)
DA.SetData(0, Math.Sqrt(a));
else
DA.SetData(0, -Math.Sqrt(a));
}
/* ... 略 ... */
}
接下来的部分就是要实现电池上增加一个按钮的功能。
创建一个自定义Attribute
我们可以直接在同一个.cs文件内,在电池的class的外面再定义一个新的class,作为我们电池的Attribute。一般来说我个人建议是每个类都单独成为一个文件,这样的话,管理起来比较方便,也更直观。但是在本例中我们就直接放在一个.cs文件内吧,这样做也是可以被编译器所接受的。
public class SqrtRootPosNeg : GH_Component
{
public override v

本文介绍了如何在Grasshopper组件中添加一个按钮,通过点击按钮切换组件的工作模式。作者创建了一个枚举类型表示工作状态,并在组件的属性类中重写了`CreateAttributes`、`Layout`和`Render`方法,以显示和渲染按钮。此外,通过重写`RespondToMouseDown`方法,实现了按钮点击时切换工作模式并更新计算结果的功能。
最低0.47元/天 解锁文章
3147





