Как использовать значение ползунка в расчетах?

У меня есть фрагмент кода, который генерирует шум. Шум генерируется в диапазоне от 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)

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

Какое значение сгенерировано ползунком?

l'L'l 08.04.2019 02:24

Это может быть что угодно между 0.0 и 1.0. Это устанавливается внутри атрибута NoiseAttribute в разделе «Блокировка максимального значения». Пользователи могут определить, что это за значение. Если я просто установлю его равным 1.0 вместо использования (0.0, NoiseAttribute), код будет работать так, как предполагалось.

boomstick 08.04.2019 02:25

А если попробовать 0.9?

l'L'l 08.04.2019 02:29

Пока я сам устанавливаю значение внутри яркости (0.0, 1.0), работает любое значение. (0.0, 0.9) правильно ограничивает использование значений. Если я установлю диапазон ползунка от 0,0 до 0,9, он все равно сделает объект полностью черным, если я вызову NoiseAttribute вместо определенного значения.

boomstick 08.04.2019 02:35

Похоже, ползунок неправильно устанавливает значение (если вообще). Вы проверили, что значение действительно установлено? И когда вы вручную устанавливаете это, где вы это делаете?

l'L'l 08.04.2019 02:43

Ну, предположительно, я определяю это в noiseAttribute = cmds.floatSliderGrp( min=0.0, max=1.0, value=1, field=True), но когда я запускаю команду печати для атрибута NoiseAttribute, он печатает «False».

boomstick 08.04.2019 03:13

Попробуйте сделать print(noiseAttribute) после строки, которая его устанавливает.

l'L'l 08.04.2019 03:29

Если я напечатаю его сразу после строки, которая его устанавливает, я получу это myWindowID|rowColumnLayout72|floatSliderGrp43

boomstick 08.04.2019 03:37

Так что, очевидно, это не установка значения в плавающее число; вам нужно будет как-то преобразовать его.

l'L'l 08.04.2019 03:39

Привет @l'L'l Просто хотел поблагодарить тебя за попытку помочь мне! Ваше первоначальное подозрение, что я не передал значение, было верным!

boomstick 08.04.2019 04:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Как напечатать значение 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')

Привет! Спасибо за ответ. Это работает по назначению. Ссылки, которые вы приложили, также очень полезны. Также спасибо @Green-Cell за попытку помочь мне!

boomstick 08.04.2019 04:43

нет проблем, пользовательский интерфейс всегда вызывает боль ^^ Также, когда вы его создаете, попытайтесь отследить, как передается ваша информация, не стесняйтесь помещать печать везде, чтобы увидеть, как аргументы передаются в пользовательском интерфейсе.

DrWeeny 08.04.2019 04:48

Другие вопросы по теме