GetLayer コマンド
タイトルの通りですが、階層の深いレイヤーのフルパスの取り出しが面倒なのでちょっとしたコマンドを作成しました。
今回作成したのは、選択したオブジェクトのレイヤーのフルパスをクリップボードに入れるというコマンドです。
挙動としては、こんな感じです。
- オブジェクトを選んだ状態(複数可)で GetLayer を実行 >> クリップボードにテキストとしてレイヤーのフルパスが文字列として入ります。
- オブジェクトが選ばれていない状態で GetLayer を実行 >> オブジェクトを選ぶように促されるのでオブジェクトを選ぶと(複数可)、クリップボードにテキストとしてレイヤーのフルパスが文字列として入ります。
データはこちらです。
github.com
※20240711, 追記
コマンド名を変更しました、詳しくは GitHub の方で確認ください。
モチベーション
エレフロントを利用していると、レイヤー名でオブジェクトを参照することが多いです。サブレイヤーが存在する場合に意図したものを取りだそうとするとフルパスを書かなければならないシーンがあります。
下の絵のように、2階の窓を取りだそうとしたときに、フルパスではなく WINDOW とだけ指定しているがこれでは1階の窓も合わせて拾われています。かといって階層のあるレイヤーをポチポチコピペしてくるのは面倒です。
これまでは what コマンドのパネルからのコピペや、頑張って目で見ながら転記とかで対処していましたが、そんなことはせずにオブジェクトのレイヤーを簡単に取得したいと思っていたのでコマンドを作成しました。
こだわりポイント
- 複数のオブジェクトでも動作します。
- 複数オブジェクトの時の気の利いた処理は諦めています(とりあえず全部クリップボードに持ってくるようにしました)テキストとして削除するほうが簡単なので、複数のオブジェクトは特別な処理はせず、複数のレイヤーを改行のある文字列としてそのまま返します。
- オブジェクトを選んだ状態で実行した場合と、オブジェクトが選ばれていない状態で実行した場合のどちらでも動作するようにしました。
- 同じレイヤー名をいくつも持ってきてもあまり意味がないので、それは解消しています。
アルゴリズム
graph TD Start((Run: GetLayer))-->B{選択状態のオブジェクトを取得} B--オブジェクト有り--> C[オブジェクトからレイヤーを取得] C-->D[レイヤーの文字列から重複テキストを削除] D-->E[レイヤーの文字列をクリップボードに貼り付け] E--> Z((END)) B--オブジェクト無し--> F((オブジェクトの選択を待つ)) F-->G{選択状態のオブジェクトを取得} G--オブジェクト有り--> CC(オブジェクトからレイヤーを取得) CC-->DD(レイヤーの文字列から重複テキストを削除) DD-->EE(レイヤーの文字列をクリップボードに貼り付け) EE--> Z G--オブジェクト無し--> Z F--コマンドをキャンセル--> Z
インストール
下記のバージョンで動作確認しています。
- Windows10
- Rhino7 SR36
- Grasshopper 1.0.0007
下の URL から rhi をダウンロードして、ダブルクリックしてインストーラの指示に従ってください。その後、ライノの再起動で反映されるはずです。
エラーが出たら教えてください。。。
※うまく動かなければ、それぞれもマシン上で RhinoPython エディタからコンパイルも可能です。プログラムはこんな感じです。
インストール先はここです。何かあればここを確認してください。
C:\Users\USER_NAME\AppData\Roaming\McNeel\Rhinoceros\7.0\Plug-ins\PythonPlugins
リファレンス
参考にした資料も貼っておきます
“copy text to clipboard” component?
discourse.mcneel.com
Creating Rhino Commands Using Python
developer.rhino3d.com
Create RHI File
developer.rhino3d.com
感想やバグ報告、機能追加の依頼などあれば、naoki.yoshioka(at)vicc.jp か、github の issue 等で連絡いただけると幸いです。