※このページは Rhino 8 を使用することを前提としています。
はじめに
みなさんは、 3D モデルを作成しているときに「このパーツのメーカーはどこだったかな?」「正確なサイズや型番を確認したいけれど、仕様書を検索して探すのが面倒だな」と感じたことはありませんか?
たとえば、広いオフィスビルの設計をしており、天井に設置する「ダウンライト(照明器具)」の 3D モデルを配置しているときを考えてみます。 その照明器具の「消費電力」や「設置に必要な寸法」を確認するために、本棚からメーカーカタログを引っ張り出したり、ウェブサイトで型番を再検索したりしなければなりません。
もし3D モデルのパーツにメーカーサイトの URL や製品の情報が直接ひもづいていれば、設計中に疑問が生じた瞬間にオブジェクトを選択するだけで、公式の仕様書やウェブサイトをブラウザで開くことができます。
他にも、次の場面でこの方法がいきてきます。
建築設計の場面:配置した「サッシ(窓)」や「ドア」の 3D モデルを選択して、メーカー公式の製品仕様書 (PDF) や、詳細な断面図が載っている CAD データのウェブページをワンクリックで開く。
プロダクトデザインの場面:モデル内に配置した「液晶ディスプレイ」や「モーター」などの部品から、社内のサーバー内に置いてある技術仕様書を表示して、設計に矛盾がないか確認する。
このように、 3D モデルを単なる形状データではなく、情報が詰まった便利なデータベースとしてもたせる方法を、本記事で解説いたします。
Rhinoの標準コマンドの [ Hyperlink ] の利用と限界
Rhino には、オブジェクトに URL やリンクを設定できる [ Hyperlink ] というコマンドがあります。
設定方法
- コマンド: [ Hyperlink ] コマンドを実行します。
- オプションから [ 付加 ] を選択します。
- オブジェクトを選択します。
- [ ウェブサイトまたはURL: ] とでたときに、開きたい URL を入力します。
設定した内容はオブジェクトを選択後、プロパティパネル(ショートカット F3 ) 内の オブジェクト > ハイパーリンクの箇所から確認できます。

リンクを開く方法
- コマンド: [ Hyperlink ] コマンドを実行します。
- オプションから [ 開く ] を選択します。
- オブジェクトを左クリックで選択します。
またショートカットとして、オブジェクトの上にマウスカーソルを合わせて Ctrl キー( Mac の場合は CMD キー)を押しながらクリックすると、登録されたウェブサイトをすぐに開くこともできます。

しかし、実際の設計業務では、1 つのオブジェクトに対して下記のような複数の情報を同時に紐づけたい場面があります。
- メーカーの「製品紹介ページ」
- 施工に必要な「取扱説明書の PDF 」
- 見積もり用の「社内価格表の共有フォルダー」
ですが、Rhinoの [ Hyperlink ] コマンドでは、1 つのオブジェクトにつき 1 つしかリンクを登録できないため、複数のリンクを使い分けることができません。
属性ユーザーテキストと Python を使った複数リンク
標準コマンドの問題を解決するために、オブジェクトがもつ「属性ユーザーテキスト(Attribute User Text)」を使ってみます。ユーザーテキストは、オブジェクトに「キー (項目名) 」と「値 (実際のデータ)」をペアにして、文字情報を埋め込む仕組みです。
たとえば、 1 つのパーツに以下のようにデータを入力してみます。
- キー: url_a / 値: 製品Aの URL
- キー: url_b / 値: 製品Bの URL
属性ユーザーテキストを入力する手順は、以下のとおりです。
- ユーザーテキストを追加したいオブジェクトを選択し、プロパティパネルを開きます(ショートカット F3 )。
- パネル上部にある [ 属性ユーザーテキスト ] アイコンをクリックします。
- 「 新規作成 」ボタンを押し、キーに url_a、値に https://… (実際の製品 A の URL) を入力します。下図は例として、アプリクラフトのホームページを設定しています。

この方法を使うことで、1 つのオブジェクトに複数のリンクを設定することができます。ただし、属性ユーザーテキストに入力した URL は、[ Hyperlink ] コマンドでは、直接クリックしてブラウザを開くことができません。
そこで、ここではプログラミング言語の Python を使ってみます。「選択したオブジェクトの指定したキーに登録した URL をブラウザで開く」 Python スクリプトを実行してみます。
下記のボタンより ZIPファイルをダウンロード・展開した Python ファイルを、任意のフォルダーに配置します。
Python ファイルの中身は
- コマンドラインからキー名を設定(デフォルト値を url_a に設定)
- オブジェクトを選択
- 選択したオブジェクトから指定したキーの値を取得
- 見つけたURLを標準のWebブラウザで開く(http、https から始まる文字のみ認識するように現在は設定済み)
といった処理を順に実行していると考えてください。
import webbrowser
import rhinoscriptsyntax as rs
def open_url():
# 1. コマンドラインからキー名を設定(デフォルト値を url_a に設定)
key = rs.GetString("検索するユーザーテキストのキーを入力してください", defaultString="url_a")
if not key: return
# 2. オブジェクトを選択
obj_id = rs.GetObject("ユーザーテキストを取得するオブジェクトを選択してください")
if obj_id is None: return # 選択できない場合は、スクリプト終了
# 3. 選択したオブジェクトから指定したキーの値を取得
url: str = rs.GetUserText(obj_id, key)
if not url:
print(f"キー '{key}' に対応するユーザーテキストが見つかりませんでした。")
return
# 4. 見つけたURLを標準のWebブラウザで開く
# ここでは、https または http から始まるURLのみ開く。ifとelseを削除も可。
if url.startswith("https://") or url.startswith("http://"):
webbrowser.open(url)
else:
print("有効なURLではありません。")
if __name__ == "__main__":
open_url()このファイルの実行手順は、以下のとおりです。
- コマンドプロンプトに [ ScriptEditor ] と入力して実行し、スクリプトエディタを起動します。
- メニュー ファイル > 開く から保存した Python スクリプトを開きます。
- スクリプトエディタの「 実行 」(再生マークのボタン)をクリックします。
- [ 検索するユーザーテキストのキーを入力してください ] で、開きたいキーを入力します。
- [ ユーザーテキストを取得するオブジェクトを選択してください ]で、キーが登録されたオブジェクトをクリックして選択します。

注意(キー名の不一致に気をつけましょう)
大文字や小文字、アンダースコア ( _) の位置が異なっていたり、半角と全角が混じっていると、キーに対応する値が見つからず、開くことができません。ご注意ください。
※該当するキーがない場合や URL が正しくない場合は、コマンドプロンプトにメッセージが表示されます
複数のボタンに異なるマクロとして登録する
ここまでの手順で、任意のキーの URL を開くことができるようになりました。ただし、現時点ではスクリプトを実行するたびに url_a や url_b といったキー名を手動で入力するので、下記のような問題があります。
入力ミスのリスク:大文字・小文字、全角・半角、アンダースコア(_)の位置などを間違えると、キーに対応する値が見つからずエラーになります。
管理の手間:(あらかじめキーを書き込んだ Python ファイルを複数用意することもできますが)固定したいキーが 10 個 あると、Python ファイルも同数の 10 個 用意しなければならず、管理が大変です。
そこで、Rhino のツールバーに専用のカスタムボタンを作成し、キー名をあらかじめ登録した「マクロ(引数付きのスクリプト実行コマンド)」を割り当ててみます。 これにより、キー名を手入力する手間を省いて入力ミスを防ぎながら、ワンクリックで目的の Web サイトを開けるようになります。
マクロの仕組みと書き方
Rhino 8 の [ ScriptEditor ] コマンドで作成したスクリプトを実行するマクロの記述は下記のようになります。
-_ScriptEditor r "Pythonファイルの絶対パス" "検索したいキー名"
※ 先頭についた – はスクリプトとして実行するという意味、_は英語のコマンド名、 r は開くのではなく実行することを意味します。また半角のスペースは Rhino で Enter を押すのと同様の意味となります。ScriptEditorコマンドとrの間、rとパス名の間、パス名とキー名の間にそれぞれ半角スペースが含まれています。
※ 1 つ目の rs.GetString に設定したい文字(キー名)を半角スペースを空けて記述しています。
スクリプト内で、
1. コマンドラインからキー名を設定。
2. オブジェクトを選択
と続く箇所の1番の処理のみ、マクロから入力する形です。
コマンドマクロのヘルプについては下記リンクを参照ください。
https://docs.mcneel.com/rhino/8/help/ja-jp/information/rhinoscripting.htm
ボタンへの登録手順
以下の手順で、 Rhino の ツールバー にカスタムボタンを作成し、マクロを登録します。
- 作成した Python スクリプト( .py ファイル)の絶対パスを取得してコピーします(パスの取得方法は後に書いてあります)。
- Rhino のツールバーの空いている場所で Shift キーを押しながら右クリックを押し、カスタムボタンを新規に作成します(既存のボタンの上でShift + 右クリックして編集することも可能です)。
- ボタンの「コマンド」欄に、取得したパスとキー名を指定した以下のマクロを記述します。パス名は配置するフォルダーにより異なります。
製品紹介ページ( url_a )を開くボタンの場合: -_ScriptEditor r “C:\(パス名)\open_url.py” “url_a”
取扱説明書( url_b )を開くボタンの場合: -_ScriptEditor r “C:\(パス名)\open_url.py” “url_b”
下図は新しく作成したボタンの左クリックに url_a を、右クリックに url_b を開くよう設定したマクロです。同じパスに置いた Python スクリプトを使用するので、キー値以外は全く同じで、キー値のみ変更しています。

またボタン自体に、ツールヒントやアイコンなども設定できます。ツールヒントにテキストを書くことでマウスを乗せたときに表示することもできます。わかりやすいように設定してください。

つまずきやすい罠と注意点
- 半角スペースによる Enter 実行の罠: Rhino のマクロにおいて、半角スペースは Enter キーと同じ役割をもつため、フォルダー名にスペースが含まれていると、パスの途中でコマンドが実行されエラーになります。パス全体および引数のキー名は、必ず半角のダブルクォーテーション ” で囲むようにしてください。
- スラッシュの向き( Windows と Mac ): Windows のフォルダーパスは \ (バックスラッシュ/円マーク)で区切られますが、 Mac の場合は / (スラッシュ)を使用します。お使いの OS に合わせた正確なパス名を取得してください。手で書くよりもエクスプローラなどからパス名をコピーした方が間違いなく取得できます。OSごとのパス名のコピーの仕方は下記を参照ください。
- チーム内で Rhino ファイルやスクリプトを共有する場合は、保存先フォルダーのパスが変わるため、各個人の環境に合わせてマクロのパスを書き換える必要があります。WindowsならCドライブ直下に、Macなら共有フォルダ /Users/Shared 以下にフォルダを作ることで、パス名を変更せずに利用可能です。
Windows の場合 : エクスプローラーで配置した Python ファイルの上で右クリックし、パスのコピー を実行します。

Mac の場合 : Finder メニュー 表示 > パスバーを表示 を押した後、Pythonファイルの上で、 右クリック > パス名をコピー を実行します。

まとめ
上記のようにユーザーテキストにリンクを埋め込むことで、オブジェクトごとに必要な情報を埋め込んで後から確認ができます。
また形を作るだけでなくモデルに属性情報を正しくもたせておくことで、 BIM ソフトへ移行するときも、属性情報を引き継いだ状態で書き出せるかもしれません。
ぜひお試しいただけたらと思います。
