vicc blog

株式会社ヴィックの技術ブログです。

雑で押し出してしまった Brep を Rhino や Grasshopper で簡単に直そう

TL;DR

Grasshopper で手早くモデルを作る際に、Brep のシーム(簡単に言うと継ぎ目です)やエッジが意外とコントロールしづらいというのを感じています。
特にチャンネル材や角パイプの押し出し形状を作る際に、シームが1箇所だけありそれだけがエッジとなっている使いにくい Brep が出来てしまうことがあります。
それを Rhino の操作でサーフェスを分割する DivideAlongCreases コマンドと、Grasshopper 上でサーフェスを分割する自作コンポーネント(RhinoCommon の SplitFacesAtTangents() の呼び出し)の紹介です。

動作環境

今回の記事での動作環境は、下記の通りです。

  • Windows11
  • Rhino7 SR37
  • Grasshopper 1.0.0007

調べた感じでは Rhino6 以降ではこの記事で紹介するように出来るようです。

以下、本編です

以前 Grasshopper の Fillet についてこんな記事を書きました。 blog.vicc.jp

こちらの記事の中では、左のモデルは使いにくいので、右の方がベターと書きました。

左のモデルは角パイプの外側サーフェスと内側サーフェスで、それぞれ1周に対して1か所のシーム(継ぎ目)があります。右のモデルでは断面での円弧と直線の境目でサーフェスが切れていてエッジがあります

Grasshopper で、円弧と直線の組み合わせからなるチャンネル材や角パイプの断面曲線を Extrude すると上の画像の左のような1か所のシームがあるだけでエッジがそこだけの Brep が生成されるというのは読者の皆様も心当たりあると思います。

そして、これを避けるために、断面曲線を分解してから Extrude したのち Join するという一工夫をしている人も多いと思います。これ、だるいですよね、、。

この現象について、フォーラム内のこちらのスレッドでも取り上げられています。
discourse.mcneel.com

僕も少し前までは、忘れずに分解してから押し出せばいいんでしょと思っていましたが、海外の方の Rhino のモデリングを YouTube で眺めていて Rhino のコマンドひとつで、円弧と直線の境目で面を分割していたのを見て、検索ワードにそれっぽい単語をいれていろいろ調べていたら ↑ のフォーラムの投稿にたどり着きました。

※フォーラムについてはこちらの vicc blog で紹介されています。 blog.vicc.jp

Rhino で簡単に直すコマンドの紹介

GH で特に何も考えず押し出してしまったシームが1箇所だけの状態の Brep を、まずは Rhino の操作で直してみます。

使うコマンドはこちら
DivideAlongCreases コマンド(Rhino ヘルプページ)
docs.mcneel.com

このコマンドでは、Tangent と Kink のそれぞれの箇所で面を分割してくれます。円弧と直線の組み合わせの断面からなるチャンネル材などでは、Tangent のオプションを Yes とすることで、円弧と直線の切り替わり部分で面が分割されます。

面が分割されない場合は、断面曲線が円弧や直線の組み合わせではなく、1本の滑らかな曲線になっていることが原因かもしれません。

押し出したままの部材に、DivideAlongCreases コマンドを実行

円弧と直線の境目でサーフェスが分割された

Grasshopper での自作コンポーネントの紹介

Rhino での直し方がわかったところで、Rhino でできるということは相応のなにかが RhinoCommon などにあるのではないかと予想できました。DivideAlongCreases などのキーワードを起点にフォーラムを掘ってみるとまさしくというスレッドがありました。
discourse.mcneel.com

↑のスレッドによると SplitFacesAtTangents() というメソッドがあるようです。実際に C# での書き方を紹介されています。

SplitFacesAtTangents method(RhinoCommon API)
https://developer.rhino3d.com/api/rhinocommon/rhino.geometry.collections.brepfacelist/splitfacesattangents

※こちら Rhino6 で追加されたものなので、Rhino6 以降では動くはずです。

C# の実装が紹介されていますが、敢えて GhPython でコンポーネントを作成しました。

※GhPython コンポーネントで UserObject(*.ghuser ファイル) を作ると、UserObjectフォルダにインストールしていない別のマシンでも、該当のコンポーネントが含まれる gh ファイルが機能するため地味に便利です!

今回作成した UserObject(SplitFacesAtTangents by RC.ghuser) と、動作を確認するサンプルファイル(SAMPLE_surface_split_at_tangents.gh)を以下より MIT ライセンスで配布します。
github.com

UserObject のインストールについてはこちらの記事を参考にしてください。
www.applicraft.com

インストール先はおそらくここです。必要に応じてこちらから削除できます。
C:\Users\NAME\AppData\Roaming\Grasshopper\UserObjects

実際の挙動はこんな感じ。

押し出したまま

円弧と直線の境目でサーフェスが切れていてエッジがあります

UserObject をインストールすると

アイコンはここに入ります、Surface > Util

検索でも呼び出せます

繰り返しになりますが、UserObject は埋め込まれる様な挙動をするので、UserObject をインストール済みの吉岡マシンでつくった gh ファイルを、何も設定をしていないインストール直後の Rhino でもその gh ファイルと問題なく開くことができるのが便利です。(UserObject は5個くらいしか作っていないので、もしかしたら違うかもしれません)

まとめ

シームが1箇所だけ入った少し使いにくい Brep を Rhino で簡単に直すコマンドと、Grasshopper で直す自作コンポーネントの紹介でした。

地味な工夫ですが、生産設計の段階でモデルを作って切って貼ってを進める中ではかなり便利だと感じます。毎回の少しの手間の積み重ねにイライラしている担当者にこの記事が届くことを願っています。

以上、地味 Tips の紹介でした。終わります。