【Grasshopper基础11】如何在GH电池上增加一个自己的按钮

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

作者:“咕咕咕?下一篇马上就写好了”

通过上一篇【基础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变量直接求算术平方根。

Snipaste_2021-09-13_08-44-08

但是,一个数的平方根有两个,一个是正数,一个负数,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
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值