スクリプト
また、2.5に戻ってきた。
で、スクリプトなんだがテキストエディタから実行するとメッシュの状態が更新されていないことがあった。
obj=(bpy.context.object) mesh=obj.data # mesh.verts.selected()は無くなった for v in mesh.verts: print(v.selected)
頂点の選択状態を表示するスクリプトなのだが選択状態が画面と違うことがある。
一度Objectモードにしてから実行したら画面と同じになった。
どうやらEditモードでの操作がリアルタイムで反映されていないらしい。
頂点を揃える
たぶんスクリプトで作れということなので作ってみた。
def noEditModeAndRestore(fn): def newFunc(*args): isEditMode=True if bpy.context.mode=='EDIT_MESH' else False if isEditMode: bpy.ops.object.editmode_toggle() fn(*args) if isEditMode: bpy.ops.object.editmode_toggle() return newFunc @noEditModeAndRestore def alignVertices(mesh, axis, pred): selected=[v for v in mesh.verts if v.selected] value=pred([v.co[axis] for v in selected]) for v in selected: v.co[axis]=value @noEditModeAndRestore def alignUv(mesh, axis, pred): if len(mesh.uv_textures)==0: return selected=[] for f, t in zip(mesh.faces, mesh.uv_textures[0].data): for i, v in enumerate(f.verts): if t.uv_selected[i]: selected.append((t, i)) value=pred([t.uv[i][axis] for t, i in selected]) for t, i in selected: #t.uv[i][axis]=value if i==0: t.uv1[axis]=value elif i==1: t.uv2[axis]=value elif i==2: t.uv3[axis]=value elif i==3: t.uv4[axis]=value obj=(bpy.context.object) mesh=obj.data # 選択頂点を # Z軸(2) # 最大値(max) # に揃える。 #alignVertices(mesh, 2, max) # 選択されたUVを # X軸(0) # 最小値(min) # に揃える。 alignUv(mesh, 0, min)
noEditModeAndRestoreはpythonのdecorator。
editモードから出て戻ってくるという処理をよく使いそうなのでdecorator関数にしてみた。
でも普通に書いたほうが分かりやすいなぁ。
Tool Shelfに登録してボタン一発にしたいところだ。
uv位置を揃えるのも作った。