Как использовать значение ползунка в расчетах? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть кусок кода, который генерирует шум. Шум генерируется в диапазоне от 0,0 до 1,0. Пока я устанавливаю определенное число, код работает. Если бы я позволил пользователям выбирать максимальный диапазон для числа с помощью ползунка, он перестает работать.

У меня есть ползунок, который заменяет значение 1,0 внутри расчета яркости. Как только я заменил значение 1.0 внутри Brightness на значение, созданное ползунком под названием 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)

Как упоминалось ранее, объект становится черным вместо того, чтобы заблокировать его максимальное значение цвета.

1 Ответ

2 голосов
/ 08 апреля 2019

Вы не передаете аргументы своим functools. Вот один из моих ответов на ту же тему: Нужна помощь в создании кнопок для циклов при вводе числа

Как напечатать значение intField в Maya Python

Maya Python - Использование данных из пользовательского интерфейса

Вы можете перейти в моей истории вопросов, я ответил намного о 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')
...