オブジェクトモードのままbmeshをいじるのと編集モードでいじるのを同じbmという名前にしたら落ちた。
(どこで落ちるか調べるように作ったやつなので中身に意味はない)
def内のbpy.ops系が動かなくなった件を調べようと作ったがops系が動かない現象再現せず。無念。
↓落ちたやつ
import bpy ,bmesh def bmbm(bm): bpy.ops.mesh.select_all(action='DESELECT') bm.verts[1].select_set(True) bpy.ops.transform.translate(value=(10, 10, 10), orient_type='GLOBAL',orient_matrix=((1,0,0),(0,1,0),(0,0,1)),orient_matrix_type='GLOBAL') obj=bpy.context.object bpy.ops.object.mode_set(mode='OBJECT') bm = bmesh.new() bm.from_mesh(obj.data) bm.verts.ensure_lookup_table() bm.verts[0].co.x=0 #ここにbm.to_mesh(obj.data)を入れるといい #ここにbm.free()を入れるといい for e in bm.edges: bpy.ops.object.mode_set(mode='EDIT') bm=bmesh.from_edit_mesh(obj.data) bm.verts.ensure_lookup_table() bm.edges.ensure_lookup_table() bmbm(bm) bpy.ops.object.mode_set(mode='OBJECT')
bm.to_mesh(obj.data)で変更を更新してbm.free()で開放してしまえば bm=bmesh.from_edit_meshがつかえる。
bmじゃなくてobmなど別の名前にしてすれば落ちない。
落ちないやつ
import bpy ,bmesh def bmbm(bm): bpy.ops.mesh.select_all(action='DESELECT') bm.verts[1].select_set(True) bpy.ops.transform.translate(value=(10, 10, 10), orient_type='GLOBAL',orient_matrix=((1,0,0),(0,1,0),(0,0,1)),orient_matrix_type='GLOBAL') obj=bpy.context.object bpy.ops.object.mode_set(mode='OBJECT') bm = bmesh.new() bm.from_mesh(obj.data) bm.verts.ensure_lookup_table() bm.verts[0].co.x=0 bm.to_mesh(obj.data) bm.free() bpy.ops.object.mode_set(mode='EDIT') bm=bmesh.from_edit_mesh(obj.data) bm.verts.ensure_lookup_table() bm.edges.ensure_lookup_table() #ループの前でbm=bmesh...してfor e in bm.edges...して #ループ内でもbm=bmesh...は完全に無理だった。 for e in bm.edges: bmbm(bm) bpy.ops.object.mode_set(mode='OBJECT')
↓ループ内のbmeshをobm=bmesh...としたら落ちなかった。
def内のbpy.ops系も正常に動いていた。また調べ直す必要あり。
import bpy ,bmesh def bmbm(bm): bpy.ops.mesh.select_all(action='DESELECT') bm.edges[1].select_set(True) bpy.ops.transform.translate(value=(10, 0, 0), orient_type='GLOBAL',orient_matrix=((1,0,0),(0,1,0),(0,0,1)),orient_matrix_type='GLOBAL') obj=bpy.context.object bpy.ops.object.mode_set(mode='OBJECT') bm = bmesh.new() bm.from_mesh(obj.data) bm.verts.ensure_lookup_table() bm.verts[0].co.x=0 bm.to_mesh(obj.data) bm.free() bm = bmesh.new() bpy.ops.object.mode_set(mode='EDIT') bm=bmesh.from_edit_mesh(obj.data) bm.verts.ensure_lookup_table() bm.edges.ensure_lookup_table() for e in bm.edges: obm=bmesh.from_edit_mesh(obj.data) obm.verts.ensure_lookup_table() obm.edges.ensure_lookup_table() bmbm(obm)
↓参考公式ドキュメント
docs.blender.org