【问题标题】:How to use a slider value in calculations?如何在计算中使用滑块值?
【发布时间】:2019-04-08 00:22:04
【问题描述】:

我有一段代码会产生噪音。噪声在 0.0 到 1.0 范围内产生。只要我设置一个定义的数字,代码就可以工作。如果我允许用​​户使用滑块选择数字的最大范围,它将停止工作。

我有一个滑块,它在亮度计算中替换了 1.0 的值。一旦我将 Brightness 中的 1.0 值替换为一个名为 noiseAttribute 的滑块生成值,代码就会中断。它没有错误并且在技术上运行,但只是使对象变黑而不是锁定颜色值。

import maya.cmds as cmds
import random
import functools

colorList = cmds.ls('colorSet*')

def createUI( pWindowTitle, pNoiseVerts):

    windowID = 'myWindowID'

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

    cmds.window( windowID, title=pWindowTitle, s=False, rtf=True )
    cmds.rowColumnLayout( numberOfColumns=1, columnWidth=[(1,200)])

    cmds.text(label= 'Max Value Lock')
    noiseAttribute = cmds.floatSliderGrp( min=0.0, max=1.0, value=1, field=True)

    cmds.button( label='Noise', command=functools.partial (addNoise) )
    def cancelCallback( *pArgs ):
        if cmds.window( windowID, exists=True ):
            cmds.deleteUI( windowID)
    cmds.button( label='Cancel', command=cancelCallback )
    cmds.showWindow()


def pNoiseVerts(object, noiseAttribute):
    verts = range(cmds.polyEvaluate(object, vertex=True))
    random.shuffle(verts)

    for vertex in verts:
        cmds.select(object + '.vtx[' + str(vertex) + ']')

        brightness = random.uniform(0.0, noiseAttribute)

        cmds.polyColorPerVertex(rgb=(brightness, brightness, brightness))
        cmds.setAttr(object + '.displayColors', True)

def addNoise(noiseAttribute, *args):
    if len(colorList) > 0:
        cmds.delete(colorList)

    objects = cmds.ls( sl=True, long=True)

    if len(objects) > 0:
        setList = cmds.ls('colorSet*')
        result = cmds.polyColorSet ( create=True, colorSet='colorSet#')
        result = cmds.polyColorPerVertex ( rgb=[0.5,0.5,0.5])  
        result = cmds.polyColorSet ( create=True, colorSet='colorSet#')

        for object in objects:
            pNoiseVerts(object, noiseAttribute)
    else:
        cmds.inViewMessage (amg='Message: <hl>Please select an object first</hl>.', pos='midCenter', fade=True )


createUI( 'Config', pNoiseVerts)

如前所述,对象变为黑色而不是锁定其最大颜色值。

【问题讨论】:

  • 滑块生成值是多少?
  • 它可以是 0.0 到 1.0 之间的任何值。这是在“最大值锁定”下的噪声属性中设置的。用户可以定义该值是什么。如果我只是将其设置为 1.0 而不是使用 (0.0,noiseAttribute) 代码将按预期运行
  • 如果你尝试0.9会怎样?
  • 只要我自己在亮度 (0.0, 1.0) 内设置值,任何值都有效。 (0.0, 0.9) 正确限制了值的使用。如果我将滑块的范围设置为 0.0 到 0.9,如果我调用 noiseAttribute 而不是特定值,它仍然会使对象完全变黑。
  • 嘿@l'L'l 只是想感谢你也试图帮助我!您最初对我没有传递值的怀疑是正确的!

标签: python maya


【解决方案1】:

你没有用你的 functools 传递任何参数 这是我对同一主题的回答之一:Need Help Making Buttons to perform for loops when you input a number

How to print the value of intField in Maya python

Maya Python - Using data from UI

你可以进入我的问题历史,我回答了很多关于functools的问题

import maya.cmds as cmds
import random
import functools

colorList = cmds.ls('colorSet*')

def createUI(pWindowTitle):

    windowID = 'myWindowID'

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

    cmds.window( windowID, title=pWindowTitle, s=False, rtf=True )
    cmds.rowColumnLayout( numberOfColumns=1, columnWidth=[(1,200)])

    cmds.text(label= 'Max Value Lock')
    noiseAttribute = cmds.floatSliderGrp( min=0.0, max=1.0, value=1, field=True)

    cmds.button( label='Noise', command=functools.partial(ui_addNoise, noiseAttribute) )
    def cancelCallback( *pArgs ):
        if cmds.window( windowID, exists=True ):
            cmds.deleteUI( windowID)
    cmds.button( label='Cancel', command=cancelCallback )
    cmds.showWindow()

def ui_addNoise(noiseSlider, *args):
    value = cmds.floatSliderGrp(noiseSlider, q=True, value=True)
    addNoise(value)


def pNoiseVerts(object, value):
    verts = range(cmds.polyEvaluate(object, vertex=True))
    random.shuffle(verts)

    for id in verts:
        # you should never select things in maya, pass it as variable : 
        vtx = '{}.vtx[{}]'.format(object, id)

        brightness = random.uniform(0.0, value)

        cmds.polyColorPerVertex(vtx, rgb=(brightness, brightness, brightness))
        cmds.setAttr(object + '.displayColors', True)


def addNoise(value):
    if len(colorList) > 0:
        cmds.delete(colorList)

    objects = cmds.ls( sl=True, long=True)

    if len(objects) > 0:
        setList = cmds.ls('colorSet*')
        result = cmds.polyColorSet ( create=True, colorSet='colorSet#')
        result = cmds.polyColorPerVertex ( rgb=[0.5,0.5,0.5])  
        result = cmds.polyColorSet ( create=True, colorSet='colorSet#')

        for object in objects:
            pNoiseVerts(object, value)
    else:
        cmds.inViewMessage (amg='Message: <hl>Please select an object first</hl>.', pos='midCenter', fade=True )


createUI( 'Config')

【讨论】:

  • 嘿!谢谢你的回答。这按预期工作。您附加的链接也很有帮助。还要感谢@Green-Cell 也试图帮助我!
  • 没问题 ui 总是很痛苦 ^^ 另外,当您制作一个时,请尝试跟踪您的信息是如何传递的,不要随意将 print 放在任何地方以查看 args 是如何传递的用户界面
猜你喜欢
  • 2020-09-27
  • 2020-07-14
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多