Пользовательский сценарий Push/Relax для Maya

Я пытаюсь создать собственный скрипт, который копирует/имитирует инструмент Maya Sculpt Geometry Tool. По сути, у меня есть 2 переключателя: «Нажать» и «Расслабить» [что, очевидно, имитирует нажатие и расслабление из параметров скульпта], ползунок значения [имитирует ползунок максимального смещения]. Радио и кнопка сброса работают отлично, однако у меня проблемы с кодированием ползунка. Любая помощь для этого? Заранее спасибо.

Пожалуйста, смотрите изображения для дальнейшего разъяснения. Нажмите здесь, чтобы увидеть изображение

Вот мой код:

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;')

person CPTN_Pixel    schedule 05.07.2017    source источник


Ответы (1)


Здесь происходят две разные вещи.

Во-первых, используя строковую форму обратных вызовов, вы теряете контроль над областью действия ваших функций. Лучше передавать объекты python напрямую. Эта версия делает то же, что и ваша, используя обратные вызовы: 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', 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 передает обратным вызовам кнопок и ползунков). Также хорошей идеей будет очистить оборванные сценарии Mel, где это возможно, если вы хотите сделать этот инструмент более сложным в будущем, это будет намного сложнее, если вам придется работать на двух языках одновременно. В этом случае artUpdatePuttyOperation выглядит так, как будто он определен при открытии пользовательского интерфейса инструмента скульпта, поэтому, если вы запустите этот скрипт без пользовательского интерфейса, я не думаю, что он будет работать правильно.

Вторая проблема заключается в том, что вы явно не устанавливаете artPuttyCtx с setTool, поэтому это не сработает, если пользователь уже не создал правильный контекст и не активировал его.

person theodox    schedule 05.07.2017
comment
Привет, сэр, и спасибо за ответ. Я сожалею о коде. Я новичок и все еще привыкаю к ​​python. Есть ли способ, чтобы переключатели работали без необходимости открывать пользовательский интерфейс инструмента скульптора? Ползунок значения работает отлично, спасибо за это. Однако, когда я нажимаю кнопку «Применить», значение изменяется (что идеально), но с сеткой ничего не происходит. заранее спасибо - person CPTN_Pixel; 07.07.2017