Rhino+Grasshopper

Rhino Inside|Rhino Insideとは

Rhino Insideとは

Rhino Insideは、Rhinoceros(以下Rhino)を他のソフトウェア環境内で直接実行できる画期的な技術です。

たとえば、RevitやAutoCAD、UnityなどのプラットフォームにRhinoを「埋め込む」ことで、Rhinoの強力なモデリング機能やスクリプトをそのまま利用できます。

この技術は、設計やエンジニアリング、開発者にとって、異なるソフトウェア間のシームレスな連携を実現します。

Rhino Insideの主な特徴とメリット

  1. クロスプラットフォーム連携:
    Rhinoの機能を他のアプリケーション内で直接利用できるため、作業フローがスムーズになります。例えば、Revit内でRhinoの形状編集ツールを使いながら、BIM要素を操作することが可能です。
  2. カスタマイズ性とスクリプト対応:
    Rhino InsideはPythonやC#を用いて高度な自動化やカスタムツールの作成が可能です。これにより、設計プロセスを大幅に効率化できます。
  3. 柔軟なデータ交換:
    ソフトウェア間のデータのやり取りが容易になり、ファイル形式を気にせずに直接操作できます。これにより、異なる業務の橋渡しが円滑になります。

Rhino Insideの始め方

Rhino Insideの利用は非常に簡単です。以下は基本的な手順です。

  1. Rhinoと対象ソフトウェアのインストール:
    Rhino 7以降が必要です。また、Rhino Insideを使用するソフトウェア(例: Revit)をインストールします。
  2. Rhino Insideプラグインの設定:
    Rhino公式サイトからRhino Insideをダウンロードし、指示に従ってプラグインを設定します。
  3. Rhino Insideの起動:
    対象ソフトウェアを開き、Rhino Insideを有効化します。たとえば、RevitではRhino Insideタブを選択することでRhinoが立ち上がります。
  4. 操作を開始:
    Rhinoのインターフェースが他のソフトウェア内で利用可能になります。Grasshopperも同時に使えるため、視覚的なスクリプト作成も簡単です。

RhinoCommon API

https://developer.rhino3d.com/api/rhinocommon

RhinoCommon APIとは?

RhinoCommon APIは、Rhinoceros(Rhino)用の公式プログラミングインターフェースです。これを使うことで、Rhinoの機能を拡張したり、自動化スクリプトやカスタムプラグインを作成できます。C#やVB.NETといった.NET言語に対応しており、複雑なモデリングや設計プロセスの効率化を実現します。RhinoCommonは、Rhino 5以降で導入され、現在も多くの開発者や設計者に利用されています。


RhinoCommon APIの主な機能とメリット

  1. ジオメトリ操作:
    点、曲線、サーフェス、メッシュなどのジオメトリの作成・編集・変換が可能です。これにより、高度な3Dモデリングをプログラムで制御できます。
  2. カスタムユーザーインターフェース(UI)の作成:
    自分専用のツールやパネルをRhino内に追加でき、作業効率を向上させるカスタマイズが可能です。
  3. イベントとドキュメント管理:
    Rhinoのドキュメント(モデルファイル)の操作や、ユーザーのアクション(例:オブジェクトの追加や削除)に反応するカスタムイベントを作成できます。
  4. Grasshopperとの連携:
    RhinoCommonを使って、Grasshopperコンポーネントやカスタムスクリプトの作成も可能です。

RhinoCommon APIの始め方

必要な環境

  • Rhinocerosのインストール: Rhino 6以降を推奨。
  • Visual Studio: C#やVB.NETで開発するために使用します。

基本的な手順

  1. 新しいプロジェクトの作成:
    Visual Studioを開き、「新しいプロジェクト」を作成し、.NET FrameworkのC#プロジェクトを選択します。
  2. RhinoCommonの参照を追加:
    RhinoCommon.dllをプロジェクトに追加します。このファイルはRhinoのインストールフォルダ内にあります。
  3. 基本コードの記述:
    以下は、Rhinoでポイントを作成するシンプルな例です: using Rhino; using Rhino.Geometry; public class MyCommand : Rhino.Commands.Command { public override string EnglishName => "AddPointExample"; protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode) { Point3d point = new Point3d(0, 0, 0); // 原点にポイントを作成 doc.Objects.AddPoint(point); doc.Views.Redraw(); return Rhino.Commands.Result.Success; } }
  4. Rhinoで実行:
    プラグインをビルドし、Rhino内でコマンドとして実行します。

Hello World!

「Hello World!」と入力し「Hello World!」と返す機能を実装します。

動作環境について

  • Rhinoceros 8
  • Grasshopper

send_str

    private void RunScript(object send_str, ref object A)
    {
        // 入力の妥当性をチェック
        if (send_str == null)
        {
            Print("Input is null.");
            A = "Invalid input.";
            return;
        }

        // 入力を文字列にキャスト
        if (send_str is not string inputString)
        {
            Print("Input is not a valid string.");
            A = "Invalid input type.";
            return;
        }

        // Named Callbackを実行
        try
        {
            using (var args = new Rhino.Runtime.NamedParametersEventArgs())
            {
                // キャスト後の文字列をセット
                args.Set("str", inputString);
                Rhino.Runtime.HostUtils.ExecuteNamedCallback("ToRiR", args);
            }

            // 出力
            A = "Callback executed successfully.";
        }
        catch (Exception ex)
        {
            Print("Error executing named callback: " + ex.Message);
            A = "Callback execution failed.";
        }
    }

receive_str

    private void RunScript(ref object Receive_str)
    {
        Receive(Component);

        Receive_str = str;
    }
    string str;
    bool registered = false;
    IGH_Component comp = null;

    void Receive(IGH_Component component)
    {
        if(!registered)
        {
            Rhino.Runtime.HostUtils.RegisterNamedCallback("ToRiR", RiRhino);

            comp = component;
            registered = true;
        }
    }

    void RiRhino(object sender, Rhino.Runtime.NamedParametersEventArgs args)
    {
        string values;
        if(args.TryGetString("str", out values))
        {
            str = values;
        }

        comp.ExpireSolution(true);
    }

Point3d

send_point

    private void RunScript(object send_point, ref object A)
    {
        // 入力の妥当性をチェック
        if (send_point == null)
        {
            Print("Input is null.");
            A = "Invalid input.";
            return;
        }

        // 入力をPoint3dにキャスト
        if (send_point is not Point3d inputPoint)
        {
            Print("Input is not a valid Point3d.");
            A = "Invalid input type.";
            return;
        }

        // Named Callbackを実行
        try
        {
            using (var args = new Rhino.Runtime.NamedParametersEventArgs())
            {
                // キャスト後のPoint3dをセット
                args.Set("point", inputPoint);
                Rhino.Runtime.HostUtils.ExecuteNamedCallback("ToRiR", args);
            }

            // 出力
            A = "Callback executed successfully.";
        }
        catch (Exception ex)
        {
            Print("Error executing named callback: " + ex.Message);
            A = "Callback execution failed.";
        }
    }

receive_point

    private void RunScript(ref object Receive_point)
    {
        Receive(Component);

        Receive_point = point;
    }
    Point3d point;
    bool registered = false;
    IGH_Component comp = null;

    void Receive(IGH_Component component)
    {
        if(!registered)
        {
            Rhino.Runtime.HostUtils.RegisterNamedCallback("ToRiR", RiRhino);

            comp = component;
            registered = true;
        }
    }

    void RiRhino(object sender, Rhino.Runtime.NamedParametersEventArgs args)
    {
        Rhino.Geometry.Point3d values;
        if(args.TryGetPoint("point", out values))
        {
            point = values;
        }

        comp.ExpireSolution(true);
    }

-Rhino+Grasshopper
-