RH Basics RH python Rhinoceros

【Rhinoceros RHpython】pythonを使用して複数のレイヤを1クリックで追加する

今回はPythonを使用して、レイヤを1クリックで設定するスクリプトを書いていきたいと思います。
RHpythonの基礎の記事になりますが、Pythonの基本的な説明は省いておりますので、Progateなどを使用してPythonの基礎を学習してからこの記事を読んでいただけるとより理解できるかと思います。

概要

上画像1枚目のように、Rhinocerosで新規プロジェクトを開くとデフォルトのレイヤがあるのみかと思います(※そうでない場合もあるかもしれませんが、基本的には特に影響はないです。)。

この状態から、Pythonで書いたスクリプトを実行することで、上画像2枚目の様にしていきたいと思います。

大まかな流れは以下のようになります。

  1. RhinocerosでPythonエディターを開く
  2. 初期設定時にある「デフォルトレイヤー」をRenameする。
  3. 新しいレイヤ名・ジオメトリの色を用意する
  4. レイヤーを追加する
  5. 一連の処理の関数化
  6. 実行確認のメッセージボックスを出す

RhinocerosでPythonエディターを開く

今回はRhinocerosであらかじめ用意されているエディターを使用します。 VScodeなど外部のエディターを使用することも可能ですので興味ある人は試してみてください。

  1. メニューバーから「ツール」⇒「Pythonscript」⇒「編集」を選択します。
  2. 上画像のような画面が開けてればOKです。実際にコードを書いていきます。

「デフォルトレイヤー」をRenameする。

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs

layerNames = rs.LayerIds()
rs.RenameLayer(layerNames[0], "00作図用オブジェクト")

初めにあらかじめ用意されている「デフォルトレイヤー」の名前を変えてみます。

(※現状のレイヤを消して、新たにかけばいいのでRenameする必要もないのですが、今回はRenameの仕方も紹介します。)

  1. 1行目では「# -*- coding: utf-8 -*-」を記載し、UTF-8の文字コードを使用することを宣言します。日本語のレイヤ名使用しますので、こちらを1行目に記載してください。
  2. 2行目で「import rhinoscriptsyntax as rs」を記載します。「rhinoscriptsyntax」という外部のモジュールを取り込みます。こちらをインポートすることで、様々なメソッドが使用可能となり、Rhinocerosであらゆる動作が可能となります。メソッドを使用する際は、「rhinoscriptsyntax.メソッド名」とメソッド名の前にモジュール名を宣言する必要がありますが、長いので「import rhinoscriptsyntax as rs」とすることで、「rs.メソッド名」と宣言できるようにしておきます。
  3. 4行目で「LayerIdsメソッド」を使用することで、現在あるれすべてのレイヤのIDを配列で取得できます。取得した配列を「layerNames」という変数に代入します。
  4. 5行目で「RenameLayerメソッド」を使用し、名前を変更していきます。第一引数に先ほど取得した配列の最初の値(0番目)「 layerNames[0] 」を、第二引数に変更するレイヤ名「"00作図用オブジェクト"」を入力しています。

このコードを実行すると、あらかじめ用意されている「デフォルトレイヤー」をRenameすることができます。

※Rhinocerosで使用できるメソッドについては公式ドキュメントをぜひ参照してみてください。エディターのヘルプから飛ぶこともできます。

新しいレイヤ名・ジオメトリの色を用意する

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
from System.Drawing import Color

layerNames = rs.LayerIds()
rs.RenameLayer(layerNames[0], "00作図用オブジェクト")

InitLayerNames=["壁","床","天井","建具","造作","什器","電気","空調","給排水衛生","ガス","防災","その他"]
Colors = [Color.Red,Color.Green,Color.Blue,Color.Yellow,Color.Orange,Color.Aqua,Color.DarkViolet,Color.GreenYellow,Color.HotPink,Color.LightSalmon,Color.Magenta,Color.MediumBlue]
  1. 8行目で新しく作成するレイヤ名を配列に格納します。「InitLayerNames」という変数名に「壁レイヤ・床レイヤ・・・・・・・その他レイヤ」を格納しました。
  2. 次にそれぞれのレイヤで表示されるジオメトリの色を用意します。3行目に「from System.Drawing import Color」と記載することで、「System.Drawing」から「Colorクラス」をインポートします。こちらを使用して色を用意していきたいと思います。
  3. 9行目で「Colors」という名前の配列にレイヤの数だけ色を用意します。「Color.Red, Color.Green・・・・・・・Color.MediumBlue」を用意しました。

レイヤーを追加する

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
from System.Drawing import Color

layerNames = rs.LayerIds()
rs.RenameLayer(layerNames[0], "00作図用オブジェクト")

InitLayerNames=["壁","床","天井","建具","造作","什器","電気","空調","給排水衛生","ガス","防災","その他"]
Colors = [Color.Red,Color.Green,Color.Blue,Color.Yellow,Color.Orange,Color.Aqua,Color.DarkViolet,Color.GreenYellow,Color.HotPink,Color.LightSalmon,Color.Magenta,Color.MediumBlue]

for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
    AddLayerName = str(index+1) + NewLayerName
    rs.AddLayer(AddLayerName,selectColor)

それではレイヤーを追加する処理を書いていこうと思います。

  1. 先ほど作成した2つの配列「InitLayerNames」・「Colors」をforループで展開していきます。「NewLayerName」に「InitLayerNames」の値を、「selectColor」に「Colors」の値を代入していきます。zip関数を使用し2つの配列を同時に展開していきます。また、enumerate関数を使用し、配列のindexも取得していきます。
  2. 「AddLayerName」に新しいレイヤ名を追加していきます。今回は、「1壁・2床・・・・12その他」とレイヤ名の前に番号を振っていきます。「str(index+1)」とすることで、index番号が取得でき、配列は0番目からスタートするので、+1しております。index番号にレイヤ名を足すことで、表示されるレイヤ名となります。1回目のループで「1壁」・2回目のループで「2床」が取得できます。
  3. 13行目で「AddLayerメソッド」を使用して、実際にレイヤを追加していきます。第一引数に追加するレイヤ名(AddLayerName)、第二引数に色(selectColor)を代入していきます。

これでレイヤを追加する処理は完了です。

一連の処理を関数化

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
from System.Drawing import Color

def LayerInit(layerNames):
    rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
    
    InitLayerNames=["壁","床","天井","建具","造作","什器","電気","空調","給排水衛生","ガス","防災","その他"]
    Colors = [Color.Red,Color.Green,Color.Blue,Color.Yellow,Color.Orange,Color.Aqua,Color.DarkViolet,Color.GreenYellow,Color.HotPink,Color.LightSalmon,Color.Magenta,Color.MediumBlue]

    for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
        AddLayerName = str(index+1) + NewLayerName
        rs.AddLayer(AddLayerName,selectColor)

layerNames = rs.LayerIds()
LayerInit(layerNames)
  1. 5~⒔行目で、一連の処理を関数名「LayerInit」関数化しました。
  2. 16行目で関数を実行しております。

実行確認のメッセージボックスを出す

# -*- coding: utf-8 -*-
import rhinoscriptsyntax as rs
from System.Drawing import Color

def LayerInit(layerNames):

    rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
    
    InitLayerNames=["壁","床","天井","建具","造作","什器","電気","空調","給排水衛生","ガス","防災","その他"]
    Colors = [Color.Red,Color.Green,Color.Blue,Color.Yellow,Color.Orange,Color.Aqua,Color.DarkViolet,Color.GreenYellow,Color.HotPink,Color.LightSalmon,Color.Magenta,Color.MediumBlue]

    for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
        AddLayerName = str(index+1) + NewLayerName
        rs.AddLayer(AddLayerName,selectColor)

if rs.MessageBox("レイヤー名を初期化しますか?",3) == 6:
    layerNames = rs.LayerIds()
    LayerInit(layerNames)
  1. 「MessageBoxメソッド」を使用し実行前にメッセージボックスを出す処理を記載します。第一引数にメッセージを(今回は「レイヤー名を初期化しますか?」)、第二引数に選択しを(3は「はい」・「いいえ」)となります。
  2. if関数でユーザーが「はい」を押した場合に実行するよう処理を書いていきます。MessageBoxメソッドは「はい」を選択すると6の値を返します。(※関数の詳細は公式ドキュメントで調べながら使っていきましょう。)

これで完了です!自動化するほどの処理ではないかもしれませんが、Rhinoceros上でpythonを使用する簡単な例として紹介しました。Pythonを使用すれば、単純作業は自動化でき、デザインの幅も広げることができると思います。是非使いこなしていきましょう。

【参考サイト】

Rhino Developer Docs:https://developer.rhino3d.com/

-RH Basics, RH python, Rhinoceros
-,