2023年12月9日發(作者:助人為樂的優美句子)

python運用maya_Maya中Python腳本的使用(四)
四、編寫Python腳本的提示與技巧
4.1 內置Python庫
Python具有許多有用的內置庫和數據結構。大多數情況下,可以使用一個現有的庫來完成常規的編程任務,這樣不必與MEL腳本-樣創建自
定義工具。
4.2使用Python類的自定義UI
其中一個方便的Python函數是l,該函數可用于將附加信息傳遞到回調函數。
例如,下面的類創建的窗口具有多個在單擊時會輸出數字的按鈕。
from functools import partial
import maya. cmds as cmds
class ButtonWin(object):
def__ init (lf):
lf. win = cmds. window()
= cmds. columnL ayout(parent=lf. win)
for x in range( 10):
cmds. button(label= "Click Here %d"%x, parent=,
command=partial(lf.
report,x))
cmds. showWindow()
def report(lf, buttonIndex, value):
print "button %d got %s "%(buttonIndex, value)
f= ButtonWin()
4.3 在Maya中調試Python腳本
使用Python腳本的一個優點是可以在開發過程中使用調試器。這在解決腳本問題時可以節省大量時間。
4.3.1 使用PDB
Python在PDB模塊中附帶一個內置的調試器。PDB的文本界面適用于快速調試會話。如果在從Script Editor (腳本編輯器)調用的腳本中使
用PDB,則每當PDB需要輸入時都會出現輸入對話框。使用PDB與導入PDB并按如下方式設定斷點一樣簡單:
import pdb
trace()
執行達到第2行時,將顯示輸入對話框,您可以使用標準命令來繼續、跳過、輸出值等。
4.3.2 使用外部調試器
對于復雜調試任務,可能更易于使用外部圖形調試器。存在多個免費的和商業的IDE,例如: ;
●Wing IDE
●Winpdb●Eclip
可以先在Maya中導入一個工具模塊來使用外部調試器,導入該模塊會打開到IDE的通信套接字。IDE連接到Maya后,即可打開腳本文件來
設定斷點、檢查變量值等。每個IDE都將具有其自己所需的工作流。
4.4將Python函數注冊為MEL程序
可以使用createMelWrapper函數將Python函數注冊為MEL程序。然后,在調用MEL程序時,會調用Python函數,從而傳遞收到的任何
參數并返回函數的結果。
路徑為:
C:Program FilesAutodeskMaya2014PythonNliblsite-packagesmayamel
或者,在腳本編輯器中執行以下命令:
import
help(MelWrapper)
使用該函數的優點如下。
通過將Python函數注冊為MEL程序,您不需要獲取MEL腳本的源代碼(如果程序和腳本共享相同的名稱)。相比之下,如果使用的是
Python,則必須先顯式導入腳本,然后才能訪問其包含的函數或類。使用該包裹器函數可以使Maya即時獲得源代碼,且不必始終加載每個
腳本。
Maya中的某些屬性只接受MEL程序。例如,在"ast" (以前稱為container )節點中,Context Properties (上下文特性)區域下的Rmb
Command (鼠標右鍵命令)屬性只接受MEL程序。
示例:
以下示例說明如何使用createMelWrapper函數將Python函數注冊為MEL程序,以便使用"ast”(以前稱為container )節點中的Rmb
Command (鼠標右鍵命令)屬性。
01 將以下腳本另存為,并保存到Maya2014/scripts目錄中。
import as cmds
import as mel
def exCoNotes(node):
if(pe(node)== container):
objCont = node
el:
objCont = ner(q=True, findContainer=node)
exec(cmds. gettr(objCont+ '.notes”
pyfunction = 'main("+node+”"'+objCont+ "
exec(pyfunction)
cmds. lect(node, r= True)
def tThisContainerCurrent(node):
if( Type(node)== container'):
objCont = node
el:objCont = cmds. container(q= True, findContainer=node)
cmds. container(objCont, e=True, c=True)
cmds. lect(node, r= True)
def rmbMyContainerScript():
return ("Execute Container Notes, "exCoNotes ,
"Set This Container Current", "tThisContainerCurrent)
02 在Script Editor (腳本編輯器)中,從Python選項卡執行以下腳本。該操作將創建所需的MEL包裹器腳本。
from rmbScript import*
import as cmds
import / as mel
MelWrapper(e= string[]')
mel. createMelWrapper(exCoNotes)
MelWrapper(tThisContainerCurrent)
03 創建一個對象。
04 選擇Asts>Advanced Asts>Create(資源>高級資源>創建),然后將rmbMyContainerScript添加到資源的Rmb Command (鼠標
右鍵命令)屬性。
注意:還可以借助變換資源使用該步驟;但是,節點類型將為dagContainer。
05 將類似如下的腳本添加到ast (資源)節點的Notes (注釋)部分。
def main(node, container):
print node
print container
06 在Script Editor (腳本編輯器)的MEL選項卡中,輸入以下腳本。
rehash;
07 在對象上單擊鼠標右鍵(),并從標記菜單中選擇Custom (自定義)。您現在可以查看自定義鼠標右鍵菜單。
4.5 為已設置動畫的曲線創建關鍵幀
可以使用以下Python示例腳本來創建已設置動畫的曲線并設定其關鍵幀。
import maya. OpenMaya as om
import maya. OpenMayaAnim as oma
def addkeys(plugName, times, values, changeCache):
# Get the plug to be animated.
/ = tionList()
(plugName)
plug = ()
g(0, plug)# Create the animCurve.
animfn = oma MFnAnimCurve()
animCurve = (plug, mCurve kAnimCurveTL)
# Copy the times into an MTimeArray and the values into an MDoubleArray.
timeArray = rray()
valueArray = eArray()
for iin range(len(imesl):
timeArray. append((timesl[i, ())
valueArray. append(values[i])
# Add the keys to the animCurve.
animfn. addKeys(
timeArray,
valueArray,
ntGlobal,
ntGlobal,
Fal,
changeCache
)
以上示例代碼會將關鍵幀動畫添加到通道(即栓)。如果不需要具有撤消更改的能力,則可以按以下方式進行調用。
addkeys(', [1.0, 3.0, 5.0], [0.6, 1.2, 2.4, None)
但是,如果需要具有撤消更改的能力,那么請按以下方式進行調用。
changeCache = urveChange()
addkeys('; [1.0, 3.0, 5.0], [0.6, 1.2, 2.4], changeCache)
然后執行以下腳本以撤消更改。
changeCache,undolt()
注意:為簡便起見,該函數假定由plugName指定的栓當前未設置動畫。
本文發布于:2023-12-09 21:24:50,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1702128290241130.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:python運用maya_Maya中Python腳本的使用(四).doc
本文 PDF 下載地址:python運用maya_Maya中Python腳本的使用(四).pdf
| 留言與評論(共有 0 條評論) |