python maya,函数调用 2 个函数,强制 运行 两个
python maya, function call 2 functions, force to run both
我制作了一个带有按钮的 windowUI 运行 2 个函数,所以我为 运行 其他 2
定义了一个新函数
def addSlider_splitLoop():
addSlider()
splitLoop()
mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )
按下按钮时,只有 1 个功能起作用:
当没有选择任何命令时,只有 运行s addSlider() 函数,
when the polygon loop is selected the command only 运行s the splitLoop() function
这实际上是有道理的,但对我没有帮助,更改函数的顺序也没有帮助
我想强制它 运行 这两个功能,我该怎么做?
实际上最好的办法是只有当 splitLoop() 工作时才将 addSlider() 设置为 运行,但我是一个真正的初学者,我不知道如何做到这一点......强制 运行 这两个功能可能是一个肮脏的解决方案,但目前对我来说已经足够了
这是完整的代码(组合按钮仅用于测试)
import maya.cmds as mc
def addSlider_splitLoop():
addSlider()
splitLoop()
def addSlider():
mc.floatSliderGrp( minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )
def splitLoop():
mc.ConvertSelectionToContainedEdges()
mc.polySplitRing(sma = 180 , wt = 0.5)
mc.polyDuplicateEdge(ch = True , of = loopDistance() )
#addSlider()
def doubleLoop():
mc.ConvertSelectionToContainedEdges()
mc.polySplitRing(sma = 180 , wt = 0.5)
mc.polyDuplicateEdge(ch = True , of = loopDistance() )
mc.polyDelEdge(e = False, cv = True,)
#addSlider()
def loopDistance():
distance = mc.floatSliderGrp('LoopDistanceValue' , query = True, value = True)
convertedDistance = distance / 100
return convertedDistance
def splitLoopUI():
if mc.window('splitLoopUI' , exists = True):
mc.deleteUI('splitLoopUI')
mc.window('splitLoopUI')
mc.frameLayout( label=' set loop distance')
mc.floatSliderGrp('LoopDistanceValue' , minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )
mc.button(label ='Triple Loop' , command = 'splitLoop()' )
mc.button(label ='Double Loop' , command = 'doubleLoop()' )
mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )
mc.text( label=' + edit loop distance + ')
mc.scrollLayout( 'scrollLayout' )
mc.columnLayout( adjustableColumn=True )
mc.showWindow('splitLoopUI')
splitLoopUI()
你不应该在你的函数命令上加上逗号。
您可以尝试使用 mc.evalDeferred('addSlider()\nsplitLoop()')。
你可以使用 try: except: finally:
由于我无法测试您的脚本,所以很难确定您的两个函数应该用什么来完成。在我看来,这是一个空闲时间的问题,你应该挠头研究evalDeferred命令。
def addSlider_splitLoop():
addSlider()
splitLoop()
mc.button(label ='Combo' , command = addSlider_splitLoop)
这里发生了几件事。
- 不要将脚本称为字符串——这会导致日后变得奇怪。而是传递函数对象,如@Dr.Weeny 的示例所示。它更可靠,实际上也更快。 More here
- 在您发布的代码中
addSlider()
没有做任何工作来获取当前活动的 GUI 对象 -- 取决于它 运行 滑块何时可以出现在任何地方 -- 在通道盒,在其他 window 中,否则它可能会失败。这可能就是为什么这个功能看起来不是 运行ning 的原因:你只是没有在新滑块结束时发现它。尝试添加调试打印。
如果你想 运行 addSlider()
在其他命令之后,最简单的做法可能是让所有工具命令 return 一个值指示他们成功或失败:
def splitLoop():
try:
mc.ConvertSelectionToContainedEdges()
mc.polySplitRing(sma = 180 , wt = 0.5)
return mc.polyDuplicateEdge(ch = True , of = loopDistance() )
except:
return None
def addSlider_splitLoop():
if splitLoop():
addSlider()
我制作了一个带有按钮的 windowUI 运行 2 个函数,所以我为 运行 其他 2
定义了一个新函数def addSlider_splitLoop():
addSlider()
splitLoop()
mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )
按下按钮时,只有 1 个功能起作用:
当没有选择任何命令时,只有 运行s addSlider() 函数,
when the polygon loop is selected the command only 运行s the splitLoop() function
这实际上是有道理的,但对我没有帮助,更改函数的顺序也没有帮助
我想强制它 运行 这两个功能,我该怎么做?
实际上最好的办法是只有当 splitLoop() 工作时才将 addSlider() 设置为 运行,但我是一个真正的初学者,我不知道如何做到这一点......强制 运行 这两个功能可能是一个肮脏的解决方案,但目前对我来说已经足够了
这是完整的代码(组合按钮仅用于测试)
import maya.cmds as mc
def addSlider_splitLoop():
addSlider()
splitLoop()
def addSlider():
mc.floatSliderGrp( minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )
def splitLoop():
mc.ConvertSelectionToContainedEdges()
mc.polySplitRing(sma = 180 , wt = 0.5)
mc.polyDuplicateEdge(ch = True , of = loopDistance() )
#addSlider()
def doubleLoop():
mc.ConvertSelectionToContainedEdges()
mc.polySplitRing(sma = 180 , wt = 0.5)
mc.polyDuplicateEdge(ch = True , of = loopDistance() )
mc.polyDelEdge(e = False, cv = True,)
#addSlider()
def loopDistance():
distance = mc.floatSliderGrp('LoopDistanceValue' , query = True, value = True)
convertedDistance = distance / 100
return convertedDistance
def splitLoopUI():
if mc.window('splitLoopUI' , exists = True):
mc.deleteUI('splitLoopUI')
mc.window('splitLoopUI')
mc.frameLayout( label=' set loop distance')
mc.floatSliderGrp('LoopDistanceValue' , minValue = 1.00 , maxValue = 99.00 , value = 50.00 , field = True )
mc.button(label ='Triple Loop' , command = 'splitLoop()' )
mc.button(label ='Double Loop' , command = 'doubleLoop()' )
mc.button(label ='Combo' , command = 'addSlider_splitLoop()' )
mc.text( label=' + edit loop distance + ')
mc.scrollLayout( 'scrollLayout' )
mc.columnLayout( adjustableColumn=True )
mc.showWindow('splitLoopUI')
splitLoopUI()
你不应该在你的函数命令上加上逗号。 您可以尝试使用 mc.evalDeferred('addSlider()\nsplitLoop()')。 你可以使用 try: except: finally:
由于我无法测试您的脚本,所以很难确定您的两个函数应该用什么来完成。在我看来,这是一个空闲时间的问题,你应该挠头研究evalDeferred命令。
def addSlider_splitLoop():
addSlider()
splitLoop()
mc.button(label ='Combo' , command = addSlider_splitLoop)
这里发生了几件事。
- 不要将脚本称为字符串——这会导致日后变得奇怪。而是传递函数对象,如@Dr.Weeny 的示例所示。它更可靠,实际上也更快。 More here
- 在您发布的代码中
addSlider()
没有做任何工作来获取当前活动的 GUI 对象 -- 取决于它 运行 滑块何时可以出现在任何地方 -- 在通道盒,在其他 window 中,否则它可能会失败。这可能就是为什么这个功能看起来不是 运行ning 的原因:你只是没有在新滑块结束时发现它。尝试添加调试打印。 如果你想 运行
addSlider()
在其他命令之后,最简单的做法可能是让所有工具命令 return 一个值指示他们成功或失败:def splitLoop(): try: mc.ConvertSelectionToContainedEdges() mc.polySplitRing(sma = 180 , wt = 0.5) return mc.polyDuplicateEdge(ch = True , of = loopDistance() ) except: return None def addSlider_splitLoop(): if splitLoop(): addSlider()