アストラルプリズム

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

Blender  bmeshを使った時に出る「run ensure_lookup_table() first」の解決方法

bmesh使って頂点の座標を取得しようとした

############################

a = bpy.context.object

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

bm = bmesh.from_edit_mesh(a.data)

v=bm.edges[0]

hxyz=(v.verts[0].co+v].verts[1].co)/2

##################################

そしたら

v=bm.edges[0]

のところで

IndexError: BMElemSeq[index]: outdated internal index table, run ensure_lookup_table() first

というエラーが出た

pythonコンソールに手動で入力すると出なくてスクリプトをコピペするとエラーが出るという謎仕様でなかなか原因が分かんなかったけどちゃんとエラーメッセージ読んでみれば「最初にensure_lookup_table()を実行せよ」ってあるよね。

 

そいう言うわけでbm.edges.ensure_lookup_table()をv=bm.edges[0]の前に追加したら普通に動いた。

.ensure_lookup_table()についてはどうもbmeshに新しく頂点を追加したりしてデータが壊れたときに使うってあったけど、特にそういうことはしてない、一体何が原因なのか分からない。

 

面なのか辺なのか頂点なのかで使い分けるっぽい。

bm.faces.ensure_lookup_table()

bm.edges.ensure_lookup_table()

bm.verts.ensure_lookup_table()

 

解決後

############################

a = bpy.context.object

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

bm = bmesh.from_edit_mesh(a.data)

bm.edges.ensure_lookup_table()

v=bm.edges[0]

hxyz=(v.verts[0].co+v].verts[1].co)/2

##################################