STUDIO TAMA


thumbnail

投稿日:2021-11-14

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

  • #Rhinoceros

  • #Python

  • #Basic

今回は Python を使用して、レイヤを1クリックで設定するスクリプトを書いていきたいと思います。


RHpython の基礎の記事になりますが、Python の基本的な説明は省いておりますので、Progate などを使用して Python の基礎を学習してからこの記事を読んでいただけるとより理解できるかと思います。

概要

thumbnail
thumbnail

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

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

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

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

Rhinoceros で Python エディターを開く

thumbnail

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

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

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

1# -*- coding: utf-8 -*-
2import rhinoscriptsyntax as rs
3
4layerNames = rs.LayerIds()
5rs.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 で使用できるメソッドについては

公式ドキュメント

をぜひ参照してみてください。エディターのヘルプから飛ぶこともできます。

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

1# -*- coding: utf-8 -*-
2import rhinoscriptsyntax as rs
3from System.Drawing import Color
4
5layerNames = rs.LayerIds()
6rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
7
8InitLayerNames=[
9  "壁",
10  "床",
11  "天井",
12  "建具",
13  "造作",
14  "什器",
15  "電気",
16  "空調",
17  "給排水衛生",
18  "ガス",
19  "防災",
20  "その他"
21]
22Colors = [
23  Color.Red,
24  Color.Green,
25  Color.Blue,
26  Color.Yellow,
27  Color.Orange,
28  Color.Aqua,
29  Color.DarkViolet,
30  Color.GreenYellow,
31  Color.HotPink,
32  Color.LightSalmon,
33  Color.Magenta,
34  Color.MediumBlue
35]
  1. 8行目で新しく作成するレイヤ名を配列に格納します。「InitLayerNames」という変数名に「壁レイヤ・床レイヤ・・・・・・・その他レイヤ」を格納しました。
  2. 次にそれぞれのレイヤで表示されるジオメトリの色を用意します。3 行目に「from System.Drawing import Color」と記載することで、「System.Drawing」から「Color クラス」をインポートします。こちらを使用して色を用意していきたいと思います。
  3. 9 行目で「Colors」という名前の配列にレイヤの数だけ色を用意します。「Color.Red, Color.Green・・・・・・・Color.MediumBlue」を用意しました。

レイヤーを追加する

1# -*- coding: utf-8 -*-
2import rhinoscriptsyntax as rs
3from System.Drawing import Color
4
5layerNames = rs.LayerIds()
6rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
7
8InitLayerNames=[
9  "壁",
10  "床",
11  "天井",
12  "建具",
13  "造作",
14  "什器",
15  "電気",
16  "空調",
17  "給排水衛生",
18  "ガス",
19  "防災",
20  "その他"
21]
22Colors = [
23  Color.Red,
24  Color.Green,
25  Color.Blue,
26  Color.Yellow,
27  Color.Orange,
28  Color.Aqua,
29  Color.DarkViolet,
30  Color.GreenYellow,
31  Color.HotPink,
32  Color.LightSalmon,
33  Color.Magenta,
34  Color.MediumBlue
35]
36
37for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
38    AddLayerName = str(index+1) + NewLayerName
39    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)を代入していきます。

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

一連の処理を関数化

1# -*- coding: utf-8 -*-
2import rhinoscriptsyntax as rs
3from System.Drawing import Color
4
5def LayerInit(layerNames):
6    rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
7
8    InitLayerNames=[
9      "壁",
10      "床",
11      "天井",
12      "建具",
13      "造作",
14      "什器",
15      "電気",
16      "空調",
17      "給排水衛生",
18      "ガス",
19      "防災",
20      "その他"
21    ]
22    Colors = [
23      Color.Red,
24      Color.Green,
25      Color.Blue,
26      Color.Yellow,
27      Color.Orange,
28      Color.Aqua,
29      Color.DarkViolet,
30      Color.GreenYellow,
31      Color.HotPink,
32      Color.LightSalmon,
33      Color.Magenta,
34      Color.MediumBlue
35    ]
36
37    for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
38        AddLayerName = str(index+1) + NewLayerName
39        rs.AddLayer(AddLayerName,selectColor)
40
41layerNames = rs.LayerIds()
42LayerInit(layerNames)
  1. 5 ~ ⒔ 行目で、一連の処理を関数名「LayerInit」関数化しました。
  2. 16 行目で関数を実行しております。

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

1# -*- coding: utf-8 -*-
2import rhinoscriptsyntax as rs
3from System.Drawing import Color
4
5def LayerInit(layerNames):
6
7    rs.RenameLayer(layerNames[0], "00作図用オブジェクト")
8
9    InitLayerNames=[
10      "壁",
11      "床",
12      "天井",
13      "建具",
14      "造作",
15      "什器",
16      "電気",
17      "空調",
18      "給排水衛生",
19      "ガス",
20      "防災",
21      "その他"
22    ]
23    Colors = [
24      Color.Red,
25      Color.Green,
26      Color.Blue,
27      Color.Yellow,
28      Color.Orange,
29      Color.Aqua,
30      Color.DarkViolet,
31      Color.GreenYellow,
32      Color.HotPink,
33      Color.LightSalmon,
34      Color.Magenta,
35      Color.MediumBlue
36    ]
37
38    for index,(NewLayerName,selectColor) in enumerate(zip(InitLayerNames,Colors)):
39        AddLayerName = str(index+1) + NewLayerName
40        rs.AddLayer(AddLayerName,selectColor)
41
42if rs.MessageBox("レイヤー名を初期化しますか?",3) == 6:
43    layerNames = rs.LayerIds()
44    LayerInit(layerNames)
  1. 「MessageBox メソッド」を使用し実行前にメッセージボックスを出す処理を記載します。第一引数にメッセージを(今回は「レイヤー名を初期化しますか?」)、第二引数に選択しを(3 は「はい」・「いいえ」)となります。
  2. if 関数でユーザーが「はい」を押した場合に実行するよう処理を書いていきます。MessageBox メソッドは「はい」を選択すると 6 の値を返します。(※関数の詳細は公式ドキュメントで調べながら使っていきましょう。)

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

【参考サイト】

Rhino Developer Docs:

目 次