如何在搅拌机中获得选定顶点的排序数组 python

How can I get a sorted array of selected verts in blender python

我在搅拌机中选择了一个顶点循环,我想将每个顶点逆时针移动到其相邻顶点的位置。

def marchVerticesACW():
    ob = bpy.context.scene.objects.active
    mesh = ob.data
    verts = [i.index for i in bpy.context.active_object.data.vertices if i.select]
    covar=mesh.vertices[verts[0]].co
    cx=covar.x
    cy=covar.y
    cz=covar.z
    for x in range(len(verts)-1):
        mesh.vertices[verts[x]].co=mesh.vertices[verts[x+1]].co
    mesh.vertices[verts[len(verts)-1]].co.x=cx
    mesh.vertices[verts[len(verts)-1]].co.y=cy
    mesh.vertices[verts[len(verts)-1]].co.z=cz

如果顶点碰巧以正确的顺序出现在列表中,但它们并不总是有效。如果顺序不对,有没有办法对列表进行排序?

我解决了这个问题,基于循环中的每个顶点都通过一条边连接到下一个顶点的事实,所以从任何顶点开始,我只搜索选定的边,寻找第一个在一端具有该顶点的边,记下该边上的下一个顶点,从集合中删除该边,然后查找在一端具有新顶点的边。它只适用于闭环,我没有进行任何错误处理/检查,但认为基本思想可能对其他人有帮助

import bpy
import bmesh


def OrderSelectedVerts(_bm):
    edge=_edges[0]
    startvert=edge.verts[0]
    _edges.remove(edge)
    _orderedVerts=[]
    _orderedVerts.append(startvert)
    while len(_edges)>0:
        startvert=GetNextVert(startvert)
        if startvert is not None:
            _orderedVerts.append(startvert)
    return _orderedVerts

def GetNextVert(sv):
    for e in _edges:
        if e.verts[0]==sv or e.verts[1]==sv:
            if e.verts[0]==sv:
                d=e.verts[1]
            else:
                d=e.verts[0]
            _edges.remove(e)
            return d


# Get the active mesh
obj = bpy.context.edit_object
me = obj.data


# Get a BMesh representation
bm = bmesh.from_edit_mesh(me)
_edges=[i for i in bm.edges if i.select]

#Get the selected verts in order
orderedVerts=OrderSelectedVerts(bm)

#Use the ordered verts


#Update the bmesh
bmesh.update_edit_mesh(me, True)