0

タイトルは少し抽象的ですが、私が探しているものには正確だと思います。具体的には、ポリゴン エッジのリストを指定して、頂点で接続されているすべてのエッジをグループ化します。

これは単純な問題であることはわかっていますが、間違った解決策を見つけ続けています。

入力例:

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]']

予想される出力:

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)

1 つのエッジを選択すると、1 つのセットが得られます。接続されていない 2 つのエッジを選択すると、2 つのセットが得られますが、両方のセットに同じエッジが含まれています。

4

3 に答える 3

0

私はここでピメルをかなりハープする傾向があることを知っていますが、誰もがコマンドの面倒を経験するのを見るのはとても苦痛です. それらに義務付けられていない場合、代替手段は次のようになります。

from pymel.core import *

verts = [i for i in polyCube()[0].vtx]

for j in verts:
    print "{0} is connected to {1}".format(j, j.connectedEdges())

オブジェクト指向の場合は、はるかに流動的です。

于 2013-07-15T01:04:41.670 に答える
0

エッジに変換されたすべての頂点から辞書を作成して試してみます。

import maya.cmds as cmds

def vert_edge_map(obj):
    verts = cmds.polyEvaluate(obj, v=True)
    mapping = {}
    for r in range(0, verts):
        edges = cmds.polyListComponentConversion(obj + ".vtx[%i]" % r, fv=True, te=True)
        edges = cmds.filterExpand(edges, sm=32)
        mapping[r] = set(edges)
    return mapping

vert_edge_map('pCube1')
# Result: {0: set([u'pCube1.e[4]', u'pCube1.e[0]', u'pCube1.e[10]']), 1: set([u'pCube1.e[0]', u'pCube1.e[11]', u'pCube1.e[5]']), 2: set([u'pCube1.e[4]', u'pCube1.e[1]', u'pCube1.e[6]']), 3: set([u'pCube1.e[1]', u'pCube1.e[7]', u'pCube1.e[5]']), 4: set([u'pCube1.e[2]', u'pCube1.e[8]', u'pCube1.e[6]']), 5: set([u'pCube1.e[2]', u'pCube1.e[9]', u'pCube1.e[7]']), 6: set([u'pCube1.e[3]', u'pCube1.e[8]', u'pCube1.e[10]']), 7: set([u'pCube1.e[3]', u'pCube1.e[9]', u'pCube1.e[11]'])} # 

すべての値がセットであるため、2 つの頂点のセットを交差させることで、2 つの頂点が接続されているかどうかをテストできます。

def are_connected(v1, v2, mapping):
    return len(mapping[v1].intersection(mapping[v2])) > 0

ユニオンを使用して、接続されたものの島を作成します。

def lots_of_edges(mapping, *verts):
   result = set()
   for v in verts:
       result = result.union(mapping[v])
   return result
于 2013-07-15T22:40:11.487 に答える