本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。
前回記事の続きです。
bluebirdofoz.hatenablog.com
Blender 2.8 Python API Documentation
以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org
今日は「落とし穴」の「モードとメッシュアクセス」です。
モードとメッシュアクセス
スクリプトでメッシュデータを使用すると、編集モードでスクリプトが期待どおりに実行されない問題が発生する場合があります。
これは、編集モードを終了するときにのみメッシュに書き戻される独自のデータを持つことが原因です。
一般的な例として、エクスポーターがobj.data(a bpy.types.Mesh)を介してメッシュにアクセスするとします。
このとき、ユーザーが編集モードでメッシュデータを利用していると、編集中のメッシュデータは同期されていません。
この状況では以下の対処が必要です。
・ツールを実行する前に[編集モード]を終了します。
・bmesh.types.BMesh.to_mesh を呼び出して、メッシュを明示的に更新します。
・スクリプトを変更して、編集モードデータでの直接作業をサポートします。bmesh.from_edit_mesh を参照してください。
・コンテキストを正しくないものとして通知し、編集モード以外でのみスクリプトを実行できるようにします。
実行例(メッシュ更新無し)
import bpy import bmesh # メッシュデータを取得する meshdata = bmesh.from_edit_mesh(bpy.context.view_layer.objects.active.data) # メッシュの一部を変更する meshdata.verts[0].co.x = 5
実行例(メッシュ更新有り)
import bpy import bmesh # メッシュデータを取得する meshdata = bmesh.from_edit_mesh(bpy.context.view_layer.objects.active.data) # メッシュの一部を変更する meshdata.verts[0].co.x = 5 # メッシュ情報を更新する bmesh.update_edit_mesh(bpy.context.view_layer.objects.active.data)