>>> 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) ... >>>
変わりました。
コメント