アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

Blender python bmeshを重ねて使ったらBlender落ちた

オブジェクトモードのまま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