Название немного абстрагировано, но я думаю, что это точно то, что я ищу. В частности, с учетом списка краев многоугольника группируйте все ребра, связанные вершиной.Сортировка предметов по общим элементам
Я знаю, что это должна быть простая проблема, но я продолжаю находить неправильное решение.
Пример ввода:
looseComponents = cmds.ls(sl=True, fl=True)
# Result: [u'pCube1.e[3]', u'pCube1.e[6]'] #
Получение выход:
found 2 component sets
[u'pCube1.e[3]']
[u'pCube1.e[3]']
Ожидаемое Ouput:
found 2 component sets
[u'pCube1.e[3]']
[u'pCube1.e[6]']
Это то, что у меня есть на данный момент, это работает в Maya, написанный в Python.
looseComponents = cmds.ls(sl=True, fl=True)
#build sub item lookup
componentVerts = {}
for component in looseComponents:
verts = cmds.ls(cmds.polyListComponentConversion(component, toVertex=True), fl=True)
vertIds = []
for vert in verts:
i = int(vert.split('[')[-1].strip(']'))
vertIds.append(i)
componentVerts[component] = set(vertIds)
sortedComponents = 0
totalComponents = len(looseComponents)
componentSets = [ [] ]
componentSets[0].append(looseComponents[0])
sortedComponents += 1
while sortedComponents < totalComponents:
# for each subSetA of setA
foundConnectingSet = False
for i in range(len(componentSets)):
# for each itemA of subSetA
for j in range(len(componentSets[i])):
# for each itemB of setB
for h in range(len(looseComponents)):
# check if itemA and itemB share a sub item
if componentVerts[componentSets[i][j]] & componentVerts[looseComponents[h]]:
# if itemB isn't already part of this subSetA
if looseComponents[h] not in componentSets[i]:
# add itemB to this subSetA
componentSets[i].append(looseComponents[h])
sortedComponents += 1
foundConnectingSet = True
if not foundConnectingSet:
starter = looseComponents[0]
for i in range(len(componentSets)):
looseComponents = list(set(looseComponents) - set(componentSets[i]))
componentSets.append([ starter ])
sortedComponents += 1
print 'found ' +str(len(componentSets))+ ' component sets'
for componentSet in componentSets:
cmds.confirmDialog()
cmds.select(componentSet, replace=True)
print cmds.ls(sl=True)
С одним выбранным краем я получаю один комплект. При выборе двух несвязанных краев я получаю два набора, но оба набора имеют одинаковое ребро.
Обратите внимание, что при дои ng 'для i в диапазоне (len (foo))', вы также можете сделать 'для i, _ в перечислении (foo)'. – Amber
Как это «сортировка»? Я думаю, что правильнее сказать, что вы классифицируете полигоны. Кроме того, без вывода, который вы получаете, и ожидаемого результата, который вы хотели бы получить, трудно понять, что именно вы хотите. – Bakuriu
true, редактирование сообщения для добавления ввода, вывода и ожидаемого вывода. –