如何在搅拌机中获得选定顶点的排序数组 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)
我在搅拌机中选择了一个顶点循环,我想将每个顶点逆时针移动到其相邻顶点的位置。
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)