ghの自作コンポーネントにZUIを適用する方法

C#

ZUIとは

ZUIはZoomable User Interfaceの略で,コンポーネントをズームしたときに[+]や[-]のボタンが現れるインターフェースです。

個人的によくZUIを使うのはList Itemコンポーネントです。リストのi番目の要素を取り出すコンポーネントですが、i+1番目やi-1番目もZUIによってアクセス可能です。

ZUIに関しては使えるコンポーネントがいくつかあって、どのコンポーネントがZUIに対応してるかは、DigiArchiさんのサイトや、GrasshopperのForumに詳しくまとめられています。

自作コンポーネントにZUIを適用する方法

例えば、「通常は入力3つでよいのだけど特殊な場合だけ入力増やしたいなぁ」というような事態にコンポーネントを作っていると遭遇します。もちろん、特殊な場合向けに、新しくコンポーネントを作れば良いですがZUIを使うこともできます。

  1. IGH_VariableParameterComponentを継承する。
  2. IGH_VariableParameterComponentのインターフェイスの関数を実装する。
  3. それぞれの関数を自分流にアレンジする。
  4. コンパイル

という感じです。コードはこんな感じ

using System;
using System.Collections.Generic;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Parameters;
using Rhino.Geometry;

namespace TAKIDAS_GH.Component
{
    public class CustomInputComponent : GH_Component, IGH_VariableParameterComponent
    {

        private int additionalInputCount = 0;
        private double v1, v2, v3;
        private double[] additionalValues = new double[3]; 

        /// <summary>
        /// Initializes a new instance of the CustomInputComponent class.
        /// </summary>
        public CustomInputComponent()
          : base("CustomInputComponent", "Nickname",
              "Description",
              "Category", "Subcategory")
        {
        }

        /// <summary>
        /// Registers all the input parameters for this component.
        /// </summary>
        protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
        {
            pManager.AddNumberParameter("Val1", "v1", "always available", GH_ParamAccess.item, 0.00);
            pManager.AddNumberParameter("Val2", "v2", "always available", GH_ParamAccess.item, 0.00);
            pManager.AddNumberParameter("Val3", "v3", "always available", GH_ParamAccess.item, 0.00);

        }

        /// <summary>
        /// Registers all the output parameters for this component.
        /// </summary>
        protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
        {
            pManager.AddNumberParameter("sum", "sum", "sum of the values", GH_ParamAccess.item);
            pManager.AddNumberParameter("average", "ave", "average of the values", GH_ParamAccess.item);

        }

        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            double sum = 0.0;
            double ave = 0.0;
            DA.GetData("Val1", ref v1);
            DA.GetData("Val2", ref v2);
            DA.GetData("Val3", ref v3);


            if (Params.Input.Count > 3)
            {
                Rhino.RhinoApp.WriteLine(Params.Input.Count.ToString());
                sum = v1 + v2 + v3;
                for(int i = 3; i<Params.Input.Count; i++)
                {
                    DA.GetData(i, ref additionalValues[i-3]);
                    sum += additionalValues[i-3];
                }
                ave = sum / (double)Params.Input.Count;
            }
            else
            {
                sum = v1 + v2 + v3;
                ave = sum / 3.0;
            }
            DA.SetData("sum", sum);
            DA.SetData("average", ave);

        }

        /// <summary>
        /// Provides an Icon for the component.
        /// </summary>
        protected override System.Drawing.Bitmap Icon
        {
            get
            {
                //You can add image files to your project resources and access them like this:
                // return Resources.IconForThisComponent;
                return null;
            }
        }

        /// <summary>
        /// Gets the unique ID for this component. Do not change this ID after release.
        /// </summary>
        public override Guid ComponentGuid
        {
            get { return new Guid("********-****-****-****-************"); }
        }

        bool IGH_VariableParameterComponent.CanInsertParameter(GH_ParameterSide side, int index)
        {
            if (side == GH_ParameterSide.Input &amp;&amp; additionalInputCount < 3 &amp;&amp; index > 2)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        bool IGH_VariableParameterComponent.CanRemoveParameter(GH_ParameterSide side, int index)
        {
            if (side == GH_ParameterSide.Input &amp;&amp; index > 2)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        IGH_Param IGH_VariableParameterComponent.CreateParameter(GH_ParameterSide side, int index)
        {
            additionalInputCount++;
            return new Param_Number();
        }
        bool IGH_VariableParameterComponent.DestroyParameter(GH_ParameterSide side, int index)
        {
            additionalInputCount--;
            return true;
        }
        void IGH_VariableParameterComponent.VariableParameterMaintenance()
        {
        }
    }
}

このコードでは、値の合計と平均を求めています。(誰得)

このコードでは入力の数を最大6個(最初からある3個、追加は3個までとしています。)この辺はプログラムの設計によりけりです。

これがデフォルトの状態
引数を増やすことができます。

また、IGH_VariableParameterComponent.CreateParameterを変更すれば、実数以外の入力(例えば点とか)もできそうです。

コメント

タイトルとURLをコピーしました