我在搅拌机中选择了一个顶点循环,我希望将每个顶点逆时针移动到其邻居的位置。
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
如果顶点碰巧以正确的顺序出现在列表中,但它们并非总是如此。有没有办法对列表进行排序,如果它恰好是不按顺序排列的?
答案 0 :(得分:2)
我根据循环中的每个顶点通过边连接到下一个顶点的事实来解决这个问题,所以从任何顶点开始我只搜索选定的边,以获得在一端具有该顶点的第一个边,注意该边上的下一个顶点,从集合中移除边,然后查找在一端具有新顶点的边。它只适用于闭环,我没有进行任何错误处理/检查,但认为基本的想法可能会帮助别人
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)