2013-03-15 25 views
8

Q: Blender 2.64では、いくつかの頂点が選択された編集モードのメッシュがあります。どのようにして、Pythonスクリプトで選択した頂点のインデックスのリストを取得または生成できますか?Blenderスクリプティング:選択した頂点のインデックス

私はBlender Python APIのリファレンスを完全にナビゲートするのが難しいと感じています.Googleは主に古くなったAPIを指しています。これは、Blenderスクリプティングのプロにとってはうれしいことです。

インデックスは、メッシュのOBJエキスポートの頂点インデックスと一致する必要があります。私は、C++プログラムでこれらの頂点にアクセスするために、頂点インデックスをテキストファイルに書き出すスクリプトを作成したいと思います。

答えて

8

あなたのコードは、実行する前にオブジェクトモードに切り替えると、確実に機能します。これは、編集モードではメッシュデータがオブジェクトモードのメッシュと同期していないためです。これは、オブジェクトモードに戻ったときに実行されます。これを確認するには、編集モードに切り替え、オブジェクトからいくつかの頂点を選択し、コードを実行してから別の頂点を選択して(編集モードのままです)、再度スクリプトを実行します。 Pythonコンソールで選択した頂点のリストは変更されません。この動作はisdocumentedです。次のコードは、最初のポインタとして機能することができ、編集モードで選択した頂点を取得するには(2.66.5 r56033でテスト):

import bpy 
import bmesh 

obj=bpy.context.object 
if obj.mode == 'EDIT': 
    bm=bmesh.from_edit_mesh(obj.data) 
    for v in bm.verts: 
     if v.select: 
      print(v.co) 
else: 
    print("Object is not in edit mode.") 

選択/ノードの選択を解除し、頂点が変更を参照するためのスクリプトを実行します。 @hochlと@DCSに基づいて

+0

出力はのようになります – Nianliang

+0

インデックスを取得するには、 "v.co"ではなく "v.index"を使用する必要があります。 – Nianliang

6

は最後に素晴らしく、コンパクト、Blogでそれを見つけた:

Verts = [i.index for i in bpy.context.active_object.data.vertices if i.select] 

それは確かにOBJエクスポート(Blender.2.64)における頂点の順序と一致しています。

+0

出力がどのように見えますBlender 2.70の[0、5]は、私が欲しいものです! – Nianliang

2

、編集モード、Pythonコンソールで実行して次の行に:

import bmesh; [i.index for i in bmesh.from_edit_mesh(bpy.context.active_object.data).verts if i.select] 

*ブレンダーバージョン2.70(2.70、2014年04月10)

関連する問題