スクリプト

また、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位置を揃えるのも作った。