MRが楽しい

MRやVRについて学習したことを書き残す

Blender 2.8のPython APIドキュメントを少しずつ読み解く 落とし穴 その3

本日は Blender2.8 の調査枠です。
Blender 2.8 の Python API ドキュメントを少しずつ読みつつ試していきます。
前回記事の続きです。
bluebirdofoz.hatenablog.com

Blender 2.8 Python API Documentation

以下のページを日本語訳しつつ実際に試して記事を進めていきます。
docs.blender.org
docs.blender.org

今日は「落とし穴」の「モードとメッシュアクセス」です。
f:id:bluebirdofoz:20200113142110j:plain

モードとメッシュアクセス

スクリプトでメッシュデータを使用すると、編集モードでスクリプトが期待どおりに実行されない問題が発生する場合があります。
これは、編集モードを終了するときにのみメッシュに書き戻される独自のデータを持つことが原因です。

一般的な例として、エクスポーターが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

f:id:bluebirdofoz:20200113142128j:plain

実行例(メッシュ更新有り)
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)

f:id:bluebirdofoz:20200113142153j:plain

bluebirdofoz.hatenablog.com