Rhino Insideとは
Rhino Insideは、Rhinoceros(以下Rhino)を他のソフトウェア環境内で直接実行できる画期的な技術です。
たとえば、RevitやAutoCAD、UnityなどのプラットフォームにRhinoを「埋め込む」ことで、Rhinoの強力なモデリング機能やスクリプトをそのまま利用できます。
この技術は、設計やエンジニアリング、開発者にとって、異なるソフトウェア間のシームレスな連携を実現します。
Rhino Insideの主な特徴とメリット
- クロスプラットフォーム連携:
Rhinoの機能を他のアプリケーション内で直接利用できるため、作業フローがスムーズになります。例えば、Revit内でRhinoの形状編集ツールを使いながら、BIM要素を操作することが可能です。 - カスタマイズ性とスクリプト対応:
Rhino InsideはPythonやC#を用いて高度な自動化やカスタムツールの作成が可能です。これにより、設計プロセスを大幅に効率化できます。 - 柔軟なデータ交換:
ソフトウェア間のデータのやり取りが容易になり、ファイル形式を気にせずに直接操作できます。これにより、異なる業務の橋渡しが円滑になります。
Rhino Insideの始め方
Rhino Insideの利用は非常に簡単です。以下は基本的な手順です。
- Rhinoと対象ソフトウェアのインストール:
Rhino 7以降が必要です。また、Rhino Insideを使用するソフトウェア(例: Revit)をインストールします。 - Rhino Insideプラグインの設定:
Rhino公式サイトからRhino Insideをダウンロードし、指示に従ってプラグインを設定します。 - Rhino Insideの起動:
対象ソフトウェアを開き、Rhino Insideを有効化します。たとえば、RevitではRhino Insideタブを選択することでRhinoが立ち上がります。 - 操作を開始:
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の主な機能とメリット
- ジオメトリ操作:
点、曲線、サーフェス、メッシュなどのジオメトリの作成・編集・変換が可能です。これにより、高度な3Dモデリングをプログラムで制御できます。 - カスタムユーザーインターフェース(UI)の作成:
自分専用のツールやパネルをRhino内に追加でき、作業効率を向上させるカスタマイズが可能です。 - イベントとドキュメント管理:
Rhinoのドキュメント(モデルファイル)の操作や、ユーザーのアクション(例:オブジェクトの追加や削除)に反応するカスタムイベントを作成できます。 - Grasshopperとの連携:
RhinoCommonを使って、Grasshopperコンポーネントやカスタムスクリプトの作成も可能です。
RhinoCommon APIの始め方
必要な環境
- Rhinocerosのインストール: Rhino 6以降を推奨。
- Visual Studio: C#やVB.NETで開発するために使用します。
基本的な手順
- 新しいプロジェクトの作成:
Visual Studioを開き、「新しいプロジェクト」を作成し、.NET FrameworkのC#プロジェクトを選択します。 - RhinoCommonの参照を追加:
RhinoCommon.dllをプロジェクトに追加します。このファイルはRhinoのインストールフォルダ内にあります。 - 基本コードの記述:
以下は、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; } } - 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);
}

