Blenderでbmeshを操作

12-7.Blender

>>> C.object
bpy.data.objects['Cube']

>>>

Cubeが選択されています。

現在のモードは、

>>> C.mode
'OBJECT'

>>>

オブジェクトモードのようです。

エディットモードに変更します。

>>> bpy.ops.object.mode_set(mode='EDIT')

>>>

モードが変わったか確認します。

>>> C.mode
'EDIT_MESH'

>>>

EDITを指定したのに、EDIT_MESHとなっています。
Cubeは、Meshなので、EDIT_MESHとなりましたが、
Textの編集時はEDIT_TEXT、CurveならEDIT_CURVEというように、
C.modeでは、それぞれの編集モードの名称が返ってきます。

Cubeのmeshを見ていきましょう。

>>> C.object.data
bpy.data.meshes['Cube']

>>>

meshのアクセスを楽にするため変数を使います。

>>> import bmesh
>>> bm=bmesh.from_edit_mesh(C.object.data)
>>> bm
<BMesh(0x00000056A66D4D58), totvert=8, totedge=12, totface=6, totloop=24>

>>>

Cubeの8箇所ある各頂点の座標を表示します。

>>> for v in bm.verts:
...     print(v.co)
...
<Vector (1.0000, 1.0000, -1.0000)>
<Vector (1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, 1.0000, -1.0000)>
<Vector (1.0000, 1.0000, 1.0000)>
<Vector (1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, 1.0000, 1.0000)>

もちろんbpy.context(C)を使ってもbpy.data(D)を使っても、同じように取得できます

>>> for v in C.object.data.vetices:
...     print(v.co)
...
<Vector (1.0000, 1.0000, -1.0000)>
<Vector (1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, 1.0000, -1.0000)>
<Vector (1.0000, 1.0000, 1.0000)>
<Vector (1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, 1.0000, 1.0000)>
>>> for v in D.objects['Cube'.data.vetices:
...     print(v.co)
...
<Vector (1.0000, 1.0000, -1.0000)>
<Vector (1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, -1.0000, -1.0000)>
<Vector (-1.0000, 1.0000, -1.0000)>
<Vector (1.0000, 1.0000, 1.0000)>
<Vector (1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, -1.0000, 1.0000)>
<Vector (-1.0000, 1.0000, 1.0000)>

x座標が1のもので、フィルタリングしてみます。

>>> for v in bm.verts:
...     if round(v.co.x) == 1:
...         print(v.co)
...
<Vector (1.0000, 1.0000, -1.0000)>
<Vector (1.0000, -1.0000, -1.0000)>
<Vector (1.0000, 1.0000, 1.0000)>
<Vector (1.0000, -1.0000, 1.0000)>

roundしておかないと、実値は下のようになっているので、正しくフィルタリングできません。

>>> for v in bm.verts:
...     print(v.co.x)
...
1.0
1.0
-1.0000001192092896
-0.9999996423721313
1.0000004768371582
0.9999993443489075
-1.0000003576278687
-0.999999403953552

>>>

いっそ扱いやすい数字に修正してしまいましょう。

>>> for v in bm.verts:
...     v.co.x = round(v.co.x, 4)
...     v.co.y = round(v.co.y, 4)
...     v.co.z = round(v.co.z, 4)
...
>>> for v in bm.verts:
...     print(v.co.to_tuple())
...
(1.0, 1.0, -1.0)
(1.0, -1.0, -1.0)
(-1.0, -1.0, -1.0)
(-1.0, 1.0, -1.0)
(1.0, 1.0, 1.0)
(1.0, -1.0, 1.0)
(-1.0, -1.0, 1.0)
(-1.0, 1.0, 1.0)

>>>

では、Cubeの形を変えてみます。

>>> for v in bm.verts:
...     if v.co.to_tuple() == (1,-1,1):
...            v.co = (0,0,0)
...
>>>


変わりました。

コメント

タイトルとURLをコピーしました