Rhino8 Grasshopper: Content Cache Part1 基礎 – 4つのアクション(Push/Pull/Bake/Purge)と基本概念を知ろう

従来のベイク操作では、常に新規のオブジェクトがRhinoのシーンに追加されていました。そのため、パラメータの編集操作後に再度ベイクする際には、古いオブジェクトを維持するか、削除する必要がありました。
Rhino8のGrasshopperに追加されたContent Cacheコンポーネントでは、Rhinoファイル上のキャッシュにベイクするため、オブジェクトを削除せずに更新できるようになりました。

1つのコンポーネントとしては機能が多いため、2回に分けてContent Cacheの概要をお伝えしていきます。

※この内容は、開発元Mcneelのフォーラム内、Content Cache Update Guide の内容を翻訳・加筆し、サンプルを加えたものになります。

※この記事は2025年2月時点・Rhino8 SR17サービスリリース候補を元に作成しています。コンポーネントの機能は時期により変更される可能性がございますので、予めご了承ください。

ContentCacheの主な役割

  1. 重複を作成せずに Grasshopper オブジェクトを Rhino に配置(Push)します。
  2. RhinoオブジェクトをGrasshopperに取り込み(Pull)、Rhinoに戻っての更新が可能です。
  3. GrasshopperからRhinoへのジオメトリの従来のベイク処理を自動化します。(Action入力)
  4. Rhinoドキュメントから参照オブジェクトを削除(Purge)します。

ContentCacheのアクション

Content Cacheコンポーネントは、ボタンが押されるたびにデフォルトのアクションを実行します。Grasshopper と Rhinoオブジェクト間の目的に合わせて、異なるデフォルトのアクションを設定できます。デフォルトのアクションは、コンポーネントの中央を右クリックし、“Button Action”メニューで設定できます。

Push – オブジェクトを取得してRhinoにPush(配置)します。

  •  Pushにより、オブジェクトがRhinoドキュメントに配置されます。デフォルトでは、Grasshopperはこのオブジェクトを追跡し続けるため、今後の更新ではオブジェクトが複製されるのではなく置き換えられます。

Bake – GrasshopperのコンテンツをRhinoにBake(配置)します。

  • Pushと異なり、オブジェクトについては追跡を行いません。
  • これを使用して、サイクルごとに新しいGUIDを持つRhinoオブジェクトを配置=複製できます。Bakeは Rhinoで重複したオブジェクトも作成するという点で、Pushとは異なります。

※但し、入力にGUIDが付属している場合(主にRhinoオブジェクトを読み込んだ場合)は、Bakeでも上書きとなります。(後述「Content CacheとGUIDについて」参照)この点が従来のベイクと異なる点です。

Pull – RhinoオブジェクトをGrasshopperにPull(取得)します。

  • Pull にはオブジェクトのGUIDが含まれており、これを使用して後でGrasshopperで特定のオブジェクトを編集、置換、または更新できます。

Purge – Rhinoドキュメントから参照オブジェクトを削除します。

  • これには通常のRhinoオブジェクトだけでなく、ブロック定義、レイヤ定義、注釈スタイル、マテリアル定義などのドキュメントレベルのオブジェクトも含まれます。
  • Rhinoと同様に、削除できるのは「使用中」ではない要素のみです。たとえば、レイヤにオブジェクトが含まれている場合、それらのオブジェクトを削除するか別のレイヤに移動するまで、そのレイヤは削除できません。

基本概念 その1:Content CacheとGUIDについて

Rhino上にあるオブジェクトはすべて、固有のIDを持っています。(下図参照)一方、Grasshopperで0から作成したオブジェクトにはまだこのIDは存在せず、BakeまたはPushによりRhinoに配置してはじめてIDが生成されます。

オブジェクトがContent Cacheに入力される際、既存のGUIDがある場合、[Push]の場合はそのオブジェクトはGUIDを保持したまま置き換えられ、複製されませんが、[Bake]の場合はGUIDに関わらず複製となります。これは、モデルオブジェクト、レイヤ、ブロック定義、マテリアルなどにも適用されます。

上の定義の場合、[Circle]コンポーネントはGUIDを持ちませんが、一度Rhinoに[Push]することでGUIDが作成され、パラメータを変更後に何度[Push]しても上書き更新となります。[Bake]の場合はボタンを押す度に複製となります。
[Brep]に格納された円錐台はRhino上にあり既にGUIDを持っているため、[Push]の場合は何度ボタンを押してもオブジェクトは1つのままです。[Bake]の場合はボタンを押す度に異なる新規のGUIDが付与され、同じ位置にオブジェクトがボタンを押した個数分だけ複製されます。

例えば、GUIDを持つカーブを、[Move]や[Scale]など従来のコンポーネントを経由して[Push]を行ってみます。これらの既存のコンポーネントはGUIDを渡す事ができないためIDは削除されます。よって、1度目の[Push]によって最初のIDとは異なるGUIDが付与され、実質複製されたオブジェクトがRhinoに配置されます。2回目からの[Push]は、何度変更後に[Push]を押しても上書き更新となります。

Rhino8から新規に追加された[Model Object]など、一部のコンポーネントはGUIDを渡す事ができます。よって、新規オブジェクト名とレイヤ名に「New Circle」を指定して[Push]を行うと、GUIDが変わらないため、既存のオブジェクトに属性が追加された状態となり、オブジェクトは複製されません。

今度は同じ[Model Object]の“G(ジオメトリ)入力”を使用して、属性を渡さずIDを削除するという簡単な変更を加えると、[Push]を使用していても異なるIDを持つ新規オブジェクトとして複製します。

Sample1:PushとBake

①Grasshopperで作成したオブジェクトについては、Push/Bake前はGUIDは存在しません。
②[Push]を押すと、オブジェクトがベイクされ、GUIDが生成されます。
③パラメータを変更して再度[Push]を押すと、変更された形状のオブジェクトがベイクされます。GUIDは同じなので、オブジェクトは複製されず、上書き更新されます。
④[Bake]の場合は、最初にベイクされIDが作成されるところまでは同様ですが、[Bake]はGUIDを無視するため、その後パラメータを変更して[Bake]を押す度に新規のオブジェクトが複製されます。

※デフォルトでは、Push/Bakeで作成されたRhinoオブジェクトは「Grasshopper」レイヤの各オブジェクト種類のレイヤに配置されます。レイヤを変更するには、[Model Object]コンポーネントなどを使用してレイヤを予め指定します。(Part2:Bake/Push時のレイヤについて 参照)

基本概念 その2: C(Content)出力とR(Result)出力について

Content CacheコンポーネントのResult出力が表示されている状態では、コンポーネントは常にPull (RhinoからGrasshopperへ読み込み)を行います。この出力は、Grasshopper定義において後で使用できます

以下の例では、Point LightをPushした後に、Rhino側で移動を行っています。Content CacheのC出力は入力を直接出力に渡すパススルー出力です。R出力からは常にPull,つまりRhinoでの状態がGrasshopperへ読み込まれます。よって、移動後のLight位置はR出力から取得する事になります。

※R出力端子が表示された状態でPush/BakeしたオブジェクトをRhino上で一部削除すると、Pullが行えないため、参照モデルが削除されたという警告がでます。逆に、R出力が表示されていなければ、Pullは行われないため警告はでません。

基本概念 その3: Pushの追跡について

[Push]の基本機能として、Rhino上に配置された後もさかのぼってオブジェクトの追跡を続ける、という性質があります。

以下の例では、Pushした1階のLightをRhino上で配置変更し、2階に移動(コピー)後、再度Pushしています。GrasshopperはPushしたオブジェクトを逆に追跡し続けるため、1階のLightの位置を移動すると、2階のLightも1階と同じ位置に移動します。Bakeは追跡を行いませんので、Bakeにて作成した2階のLightは、1階のLightとは独立して移動します。プログラムは左から右に流れるため、Push/Bakeいずれの場合でも、後工程(2階)の移動は前工程(1階)には影響を与えません。

Sample2:Pullの使用例 その1(キャッシュ名なし)

Pullは、Rhino上にあるオブジェクトをGrasshopperへ読み込みます。以下のサンプルでは、一度Pushを行ってRhinoに配置したポイントを移動した後、Pullを使用してGrasshopperへ取り込み、サーフェスを生成しています。(ここでは、キャッシュ名を使用せずそのままPullを使用しています。)

①[Push]オプションにてポイントをRhinoに配置
②Rhino側でポイントを移動
③3A:[Pull]にて移動後のポイントを読込み、サーフェスを作成
3B:前述の通りPushのR出力は常にPullを行うため、このアルゴリズムの場合は[Push]オプションのR出力からの結果を使用しても、3Aと同じ結果となります。

この例では、Push/BakeのR出力がPullを兼ねるため、Pullを省略する事ができます。Pullを単体で使用する例としては、次のPart2で説明するキャッシュ名を使用したサンプルをご参照ください。

Sample3:Purge

PurgeはPushした参照オブジェクトをRhinoから削除します。例えば、ブロックをPushにてRhinoに配置後、Rhino側でオブジェクトをDeleteキーで削除しても、ブロックパネルやレイヤパネルには情報が残ったままになりますが、Purgeを使用するとブロックやレイヤ情報なども削除する事ができます。

①椅子の金属部分(Pipe)と座面(Seat)をそれぞれ[Model Object]にて名前とレイヤを指定した後、[Model Block Definition]と[Model Block Instance]にてブロック定義をします。
②ブロック定義したオブジェクトを再度[Model Object]で名前とレイヤを指定します。
③[Push]にてRhino上に配置します。レイヤとブロックを確認します。
④Rhino上でオブジェクトを削除しても、レイヤとブロック情報はそのままですが、[Push]の上で右クリックを行い、[Purge]を行うと、オブジェクト、レイヤ、ブロック情報全てが削除されます。

※Pushの後に別コンポーネントとしてPurgeを接続しても効果はありません。Pushしたものを削除するには、同じコンポーネント上で右クリックしてPurgeに切り替えるか、キャッシュ名(Part2で後述)を使用する必要があります。

※Rhinoと同様、削除できるのは「使用中」ではない要素のみです。たとえば、レイヤにオブジェクトが含まれている場合、それらのオブジェクトを削除するか別のレイヤに移動するまで、そのレイヤはPurgeできません。

下図は、[Model Layer]にて空レイヤを作成後、レイヤ04にオブジェクトを作成してからPurgeを行った例。

Part1は以上です。Part2に続きます!