2017-07-05 14 views
0

Maya Sculpt Geometryツールを複製/模倣するカスタムスクリプトを作成しようとしています。基本的に私はプッシュとリラックスの2つのラジオボタンを持っていますが、値スライダーは最大変位スライダーを再現します。ラジオボタンとリセットボタンは完全に機能しますが、スライダのコーディングに問題があります。このための助け?前もって感謝します。Mayaカスタムプッシュ/リラックススクリプト

詳しい説明は画像を参照してください。ここで Click here for image

私のコードです:

import maya.cmds as cmds 
import maya.mel as mel 


if cmds.window("cusWin", exists = True): 
    cmds.deleteUI("cusWin") 



customwindow = cmds.window("cusWin",t= "Push/Relax", wh = (200, 117), s= False, mnb= False, mxb= False) 
cmds.frameLayout(label='Push/Relax Modifier', borderStyle='in', cll= False) 
cmds.columnLayout(adj = True, columnOffset= ("both", 3)) 


cmds.radioCollection() 
cmds.radioButton(l = "Push", onc= "mel.eval('artUpdatePuttyOperation artPuttyCtx push ;')") 
cmds.radioButton(l = "Relax", onc= "mel.eval('artUpdatePuttyOperation artPuttyCtx relax ;')") 

cmds.separator(style= "none", h= 3) 

DynFsgCol1 = 30 
DynFsgCol2 = 50 
DynFsgCol3 = 100 

valSlider = cmds.floatSliderGrp(l = "Value", field = True, min = 0, max= 5, precision = 4, cw3= (DynFsgCol1, DynFsgCol2, DynFsgCol3)) 
cmds.separator(style= "none", h= 3) 

cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,98),(2,100)], columnOffset=[(1,'left',1),(2,'right',95)]) 
cmds.button(l = "Apply", w= 92, c= 'slider()') 
cmds.button(l = "Reset", w= 91, c= 'resetButton()') 

cmds.showWindow(customwindow) 


def slider(): 
    valueSlider = cmds.floatSliderGrp(valSlider, q= True, value= True) 
    mel.eval('artPuttyCtx -e -maxdisp valueSlider `currentCtx`;') 

def resetButton(): 
    mel.eval('resetTool artPuttyContext;') 

答えて

0

ここで起こって二つの異なるものがあります。

最初に、コールバックの文字列形式を使用すると、関数のスコープを制御できなくなります。 Pythonオブジェクトを直接渡す方が良いでしょう。このバージョンでは、あなたのは、コールバックを使用して行うことを目的としているように見えるものを行います。 輸入maya.cmdsがCMDS 輸入maya.melとしてメル

if cmds.window("cusWin", exists = True): 
    cmds.deleteUI("cusWin") 



customwindow = cmds.window("cusWin",t= "Push/Relax", wh = (200, 117), s= False, mnb= False, mxb= False) 
cmds.frameLayout(label='Push/Relax Modifier', cll= False) 
cmds.columnLayout(adj = True, columnOffset= ("both", 3)) 


cmds.radioCollection() 
push = lambda _: cmds.artPuttyCtx(cmds.currentCtx(), e = True, mtm='push') 
relax = lambda _: cmds.artPuttyCtx(cmds.currentCtx(), e = True, mtm='relax') 



cmds.radioButton(l = "Push", onc= push) 
cmds.radioButton(l = "Relax", onc=relax) 

cmds.separator(style= "none", h= 3) 

DynFsgCol1 = 30 
DynFsgCol2 = 50 
DynFsgCol3 = 100 

valSlider = cmds.floatSliderGrp(l = "Value", field = True, min = 0, max= 5, precision = 4, cw3= (DynFsgCol1, DynFsgCol2, DynFsgCol3)) 
cmds.separator(style= "none", h= 3) 
cmds.rowColumnLayout(numberOfColumns=2, columnWidth=[(1,98),(2,100)], columnOffset=[(1,'left',1),(2,'right',95)]) 

# put the defs here, where the names of the slider are known 
def slider(*_): 
    valueSlider = cmds.floatSliderGrp(valSlider, q = True, value = True) 
    cmds.artPuttyCtx(cmds.currentCtx(), e = True, maxdisp = valueSlider) 

def resetButton(*_): 
    cmds.resetTool(cmds.currentCtx()) 

cmds.button(l = "Apply", w= 92, c= slider) 
cmds.button(l = "Reset", w= 91, c= resetButton) 

cmds.showWindow(customwindow) 

ように注意する事は、物事が定義された順序が可能であることですあなたが作ったコントロールの名前を参照する必要があります。 (さて、Mayaがボタンとスライダのコールバックに渡すナンセンスの引数を処理する必要があります)。できるだけメルスクリプトをぶら下げておくのも良い考えです。もしあなたがこのツールをもっと複雑にしたいのであれば、すぐに2つの言語で作業しなければならない場合はずっと難しくなります。この場合、artUpdatePuttyOperationは彫刻ツールのUIが開いたときに定義されているように見えるので、UIなしでこのスクリプトを実行すると正しく動作するとは思われません。

artPuttyCtxsetToolに明示的に設定していないため、ユーザーが既に適切なコンテキストを作成してアクティブ化していない限り、この機能は動作しません。

+0

こんにちは、お返事ありがとうございます。コードは残念です。私は初心者で、まだPythonに慣れています。スカルプトツールのUIを開く必要なく、ラジオボタンが機能する方法はありますか?値スライダーは完全に機能してくれてありがとうございます。しかし、私が "適用"ボタンをクリックすると値が変わります(これは完璧です)が、メッシュに何も起こりません。前もって感謝します –