2017-07-25 95 views
1

我想要做的是將控制器複製到另一端,並將_L重命名爲_R。所以我只需要選擇控制器,它會創建一個組,然後創建另一個組,在右側對其進行鏡像,並將其他組重命名爲_R。然後,第一個團體向世界展開。這就是我想要做的。但我堅持重命名。我知道我必須逆向排序列表進行重命名,但每當我做瑪雅人說:在Maya中將重複列表「L」重命名爲「R」python

More than one object matches name

複製的對象有不同的父母的名字和相同的孩子的名字。請告訴我該怎麼做,以及我錯過了什麼。

import maya.cmds as cmds 

list = cmds.ls(sl=1) 
grp = cmds.group(em=1, name=("grp" + list[0])) 

# creating constraint to match transform and deleting it 
pc = cmds.pointConstraint(list, grp, o=[0,0,0], w=1) 
oc = cmds.orientConstraint(list, grp, o=[0,0,0], w=1) 
cmds.delete(pc, oc) 

# parenting it to controller 
cmds.parent(list, grp) 

# creating new group to reverse it to another side 
Newgrp = cmds.group(em=1) 
cmds.parent(grp, Newgrp) 
Reversedgrp = cmds.duplicate(Newgrp) 

cmds.setAttr(Reversedgrp[0] +'.sx', -1) 

selection = cmds.ls(Reversedgrp, long=1) 
selection.sort(key=len, reverse=1) 
+0

不相關,但你不應該在python中命名一個變量'list'。 –

+0

@NickA是對的,你不應該用Python保留字命名你的變量。確保你將'list'重命名爲'_list'或任何未保留的;它可能是相關的,也可能不是,你的劇本的行爲變得相當不可預測。當你在第一行調用'cmds.ls()'的時候,你可能也想使用'long'參數,例如:'_list = cmds.ls(sl = 1,long = 1)' – mapofemergence

+0

Where是你重命名對象的代碼的一部分? – UKDP

回答

2

在Maya中重命名是非常煩人的,因爲名稱是您對對象本身的唯一句柄。

的一般技巧基本上是:

  1. 複製的項目與rr標誌,所以你只能得到頂層節點
  2. 使用listRelativesadfull標誌得到複製的所有孩子頂部節點,如|Parent|Child|Grandchild。在這種形式中,名稱上方的整個層次結構依次列出(您也可以在對象上使用cmds.ls(l=True)
  3. 對該列表進行排序,然後將其反轉。這將使最長的路徑名第一,這樣你就可以與葉節點開始和工作的方式向上
  4. 現在遍歷的項目和應用您重命名模式

所以這樣的事情,雖然你可能想用你控制的東西替換選擇:

import maya.cmds as cmds 
dupes = cmds.duplicate(cmds.ls(sl=True), rr=True) # duplicate, return only roots 
dupes += cmds.listRelatives(dupes, ad=True, f=True) # add children as long names 
longnames = cmds.ls(dupes, l=True)     # make sure we have long name for root 
longnames.sort()  # usually these sort automatically, but's good to be safe 
for item in longnames[::-1]: # this is shorthand for 'walk through the list backwards' 
    shortname = item.rpartition("|")[-1] # get the last bit of the name 
    cmds.rename(item, shortname.replace("r","l")) # at last, rename the item 
1

感謝「theodox」這是非常有用的。但在排序,長名稱,短名稱和.rpartition中仍然有點困惑......但無論如何,我最終創建了這個腳本。

import maya.cmds as cmds 
_list = cmds.ls(sl=1) 
grp = cmds.group(em=1, name=("grp_"+ _list[0])) 

#creating constraint to match transfor and deleting it. 
pc=cmds.pointConstraint(_list, grp, o=[0,0,0],w=1) 
oc=cmds.orientConstraint(_list, grp, o=[0,0,0],w=1) 
cmds.delete(pc,oc) 


cmds.parent(_list, grp) 
Newgrp=cmds.group(em=1) 
cmds.parent(grp,Newgrp) 

#duplicating new group and reversing it to negative side 
dupes = cmds.duplicate(cmds.ls(Newgrp,s=0), rr=True) # duplicate,  return only roots 

cmds.setAttr(dupes[0] +'.sx', -1) 

#renaming 
dupes += cmds.listRelatives(dupes, ad=True, f=True) # add children as long names 
longnames = cmds.ls(dupes, l=True,s=0)     # make sure we have long name for root 
longnames.sort()  # usually these sort automatically, but's good to be safe 
print longnames 
for item in longnames[::-1]: # this is shorthand for 'walk through the list backwards' 
    shortname = item.rpartition("|")[-1] # get the last bit of the name 
    cmds.rename(item, shortname.replace("_L","_R")) # at last, rename the item 

#ungrouping back to world and delting unused nodes 
cmds.parent(grp, world=True) 
duplicatedGrp=cmds.listRelatives(dupes[0], c=True) 
cmds.parent(duplicatedGrp, world=True) 

cmds.delete(dupes[0],Newgrp) 

任何人都可以使用此代碼用於鏡像控制器,只需在重命名命令中更改「l」,「r」即可。

謝謝。