【Blenderアドオン】コードを簡素化するEasyBPYの使い方まとめ①

# はじめに
Blenderをpythonを使って操作する場合、Blender API(bpy)を使用してコードを書いていくが、このbpyを使ったコードはとても複雑で読みづらく、何かいい方法はないかと探していたらEasyBPYというアドオンを見つけた。[公式ページ](https://curtisholt.online/easybpy)が英語のみだったので、この記事では備忘録として公式ページをもとに日本語に翻訳してまとめていく。

# EasyBPYとは
EasyBPYは、Blender API(bpy)による複雑なコードの使用を簡素化し、人が読みやすくすることを目的としているモジュールである。
![easybpy](https://www.blendernation.com/wp-content/uploads/2020/09/EasyBPY_BN-728x336.jpg)

### 入手先
* [github](https://github.com/curtisjamesholt/EasyBPY)
* [Gumroad](https://curtisjamesholt.gumroad.com/l/easybpy)
* [Blender Market](https://blendermarket.com/products/easybpy)

### インストール場所

::: note 
easybpy.pyモジュールをBlenderの「modules」フォルダーに配置する。

blnder2.93の場合
 C:\Users\USER\AppData\Roaming\Blender Foundation\Blender\2.93\scripts\modules

※blenderのバージョンは使用しているものに合わせて適宜変更する。

:::


## インポート
テキストエディタまたはPythonコンソールで`from easybpy import *`　を使用して、easybpyモジュールをインポートする。

::: note warn
別のアドオン内で使用したい場合

ユーザーがインストールしたモジュールと衝突するのを防ぐため、アドオンフォルダ内にパッケージし、関数をインポートするとき`from . easybpy import *`で直接指定すること。
:::
# オブジェクトの操作
### オブジェクトの選択

```selecting_objects.py
from easybpy import *

#アクティブオブジェクトを返す
my_object = active_object()

#選択された全てのオブジェクトを返す
my_objects = selected_objects()

#シーン内のすべてのオブジェクトを選択する
select_all_objects()

#シーン内の全てのライトオブジェクトを選択する
lights = select_all_lights()

#現在の選択範囲を反転させる
invert_selection

#少なくとも一つのモディファイアを持つオブジェクトのリストを返す
mod_objects = get_objects_with_modifiers()

#少なくとも一つのモディファイアを持つ全てのオブジェクトを選択する
select_objects_with_modifiers()
```

**select_all_hoge()関数は、hogeの部分を、別の種類のオブジェクトの単語に置き換えることで他のタイプでも動作させることができる。**

例:
meshes(メッシュ), curves(カーブ), surfaces(サーフェイス), metas(メタ), text(テキスト), hair(髪) , point_clouds(点群), volumes(ボリューム), armatures(アーマチュア), lattices(ラティス), empties(エンプティ), grease_pencils(グリースペンシル), cameras(カメラ), speakers(スピーカー), light_probes(ライトプローブ)

::: note 
次の関数は、ショートカットのように動作する便利な代替関数である。
ao()       　　　#active_object()
so()      　　　 #selected_objects()
::: 



### オブジェクトの取得・名前の変更・削除
EasyBPYの多くの関数は様々なタイプの引数（入力）を受け入れるように設計されている。アクティブオブジェクトを操作するときは、引数なしでもタスクを実行することができる場合がある。以下にいくつかの例を示す。

```argument_context.py
from easybpy import *

#アクティブオブジェクトを取得する
obj = get_object()

#'Cube' という名前のオブジェクトを指定し、取得する
obj = get_object("Cube")

#'object'の名前を'New Name'に変更する
rename_object(object, "New Name")

#アクティブオブジェクトの名前を'New Name'に変更する
rename_object("New Name")

#'Cube' という名前のオブジェクトを削除する
delete_object("Cube")

#指定された参照先からオブジェクトを削除する
delete_object(object)
```



### オブジェクトの複製・インスタンス化

```copy_instance.py

#'object' のコピーを作成し、'My Collection' という名前のコレクションに格納する
copy_object(object, 'My Collection')

#'object' のコピーを作成し、アクティブなコレクションに格納する
copy_object(object)

#'Cube' を見つけ、'My Collection' という名前のコレクションに入れる
copy_object("Cube", "My Collection")

#複製した新しいオブジェクトを変数に保存する
new_obj = copy_object(object)

#'object' のインスタンスを新しい名前で作成し、'My Collection' に移動する
instance_object(object, "New Name", "My Collection")

#以下のようにインスタンスを取得することも可能
new_obj = instance_object(object, "New Object", "My Collection")
```


### オブジェクトの変換
```object_conversion.py
#与えられたオブジェクトをメッシュに変換する
convert_to_mesh(object) 
convert_to_mesh("Object Name")

#与えられたオブジェクトをグリースペンシルオブジェクトに変換する
convert_to_grease_pencil(object) 
convert_to_grease_pencil("Object Name")

#与えられたオブジェクトを曲線オブジェクトに変換する
convert_to_curve(object)
convert_to_curve("Object Name")
```

### シェーディング
```object_shading.py
#オブジェクトのシェードの種類をスムーズに設定する
shade_object_smooth(object)
shade_smooth(object)        #上と同じ

#オブジェクトのシェードの種類をフラットに設定する
shade_object_flat(object) 
shade_flat(object)          #上と同じ

#自動スムーズを有効にし、角度を「60」に設定する
set_smooth_angle(object, 60)
```

# プリミティブ（メッシュ）の操作
### プリミティブ（メッシュ）を追加する
プリミティブの追加は、作りたいもの記述するだけでとても簡単である
```creating_primitives.py
#メッシュ
create_plane()         #平面
create_cube()          #立方体
create_circle()        #円
create_cylinder()      #円柱
create_uv_sphere()     #UV球
create_sphere()        #球
create_ico_sphere)     #ICO球
create_cone()          #円錐
create_torus ()        #トーラス
create_grid()          #グリッド
create_suzanne()       #スザンヌ　※モンキーと同じ
create_monkey()        #モンキー

#カーブ
create_bezier_curve()  #ベジエカーブ
create_bezier()        #ベジエ　※ベジエカーブと同じ
create_circle_curve()  #ベジエ円
create_nurbs_curve()   #NURBSカーブ
create_nurbs_circle()  #NURBS円
create_nurbs_path()    #NURBSパス
create_path()          #NURBSパス ※上と同じ

#サーフェイス
create_nurbs_curve_surface()       #NURBS面カーブ
create_curve_surface()             #NURBS面カーブ　※上と同じ
create_nurbs_circle_surface()      #NURBS面円
create_circle_surface()            #NURBS面円　　　※上と同じ
create_nurbs_surface()             #NURBSサーフェイス
create_nurbs_cylinder_surface()    #NURBS円柱
create_cylinder_surface()          #NURBS円柱　　　※上と同じ
create_nurbs_sphere_surface()      #NURBS球
create_sphere_surface()            #NURBS球　　　　※上と同じ
create_nurbs_torus_surface()       #NURBSトーラス
create_torus_surface()             #NURBSトーラス　※上と同じ

#メタボール
create_metaball()                  #メタボール
create_metaball_capsule()          #メタボール_カプセル
create_metaball_plane()            #メタボール_平面
create_metaball_ellipsoid()        #メタボール_楕円
create_metaball_cube()             #メタボール_立方体


#テキスト
create_text_object()  #テキスト
create_text()         #テキスト　※上と同じ
```
### モード選択
オブジェクト単位でワークフローに最適なモードを取得・設定ができる
**※引数にはアクティブオブジェクトを指定すること**　　

```modes.py
#オブジェクトモードに設定する
set_object_mode(object)
object_mode(object)          #上と同じ

#編集モードに設定する
set_edit_mode(object) 
edit_mode(object)             #上と同じ

#スカルプトモードに設定する
set_sculpt_mode(object)
sculpt_mode(object)           #上と同じ

# 頂点ペイントモードに設定する
set_vertex_paint_mode(object)
vertex_paint_mode(object)     #上と同じ

#ウェイトペイントモードに設定する。
set_weight_paint_mode(object)
weight_paint_mode(object)     #上と同じ

#テクスチャペイントモードに設定する
set_texture_paint_mode(object)
texture_paint_mode(object)    #上と同じ
```
### 表示・非表示
```show_hide.py
#オブジェクトを非表示にする
hide_object(object)
hide(object)             #上と同じ

#オブジェクトを表示する
show_object(object) 
show(object)             #上と同じ
unhide_object(object)    #上と同じ
unhide(object)           #上と同じ

#ビューポート内のオブジェクトを非表示にする
hide_in_viewport(object)

#ビューポート内のオブジェクトを表示する
show_in_viewport(object)
unhide_in_viewport(object)  #上と同じ

#レンダリングでオブジェクトを非表示にする
hide_in_render(object)

#レンダリングでオブジェクトを表示する
show_in_render(object) 
unhide_in_render(object)   #上と同じ
```
### 表示の使い分け
```display_types.py
#オブジェクトのバウンディングボックスを表示する
display_as_bounds(object)

#オブジェクトをテクスチャ付きで表示する
display_as_textured(object)

#オブジェクトをソリッド表示する
display_as_solid(object)

#オブジェクトをワイヤーフレーム表示する
display_as_wire(object)

```

# 参考
本記事で紹介したコードは、EasyBPYの[公式ページ](https://curtisholt.online/easybpy)に基づいています。