У меня есть фрагмент кода, который генерирует шум. Шум генерируется в диапазоне от 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)
Как упоминалось ранее, объект становится черным, а не блокируется максимальное значение цвета.
Это может быть что угодно между 0.0 и 1.0. Это устанавливается внутри атрибута NoiseAttribute в разделе «Блокировка максимального значения». Пользователи могут определить, что это за значение. Если я просто установлю его равным 1.0 вместо использования (0.0, NoiseAttribute), код будет работать так, как предполагалось.
А если попробовать 0.9
?
Пока я сам устанавливаю значение внутри яркости (0.0, 1.0), работает любое значение. (0.0, 0.9) правильно ограничивает использование значений. Если я установлю диапазон ползунка от 0,0 до 0,9, он все равно сделает объект полностью черным, если я вызову NoiseAttribute вместо определенного значения.
Похоже, ползунок неправильно устанавливает значение (если вообще). Вы проверили, что значение действительно установлено? И когда вы вручную устанавливаете это, где вы это делаете?
Ну, предположительно, я определяю это в noiseAttribute = cmds.floatSliderGrp( min=0.0, max=1.0, value=1, field=True)
, но когда я запускаю команду печати для атрибута NoiseAttribute, он печатает «False».
Попробуйте сделать print(noiseAttribute)
после строки, которая его устанавливает.
Если я напечатаю его сразу после строки, которая его устанавливает, я получу это myWindowID|rowColumnLayout72|floatSliderGrp43
Так что, очевидно, это не установка значения в плавающее число; вам нужно будет как-то преобразовать его.
Привет @l'L'l Просто хотел поблагодарить тебя за попытку помочь мне! Ваше первоначальное подозрение, что я не передал значение, было верным!
Вы не передаете никаких аргументов с помощью своих 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 за попытку помочь мне!
нет проблем, пользовательский интерфейс всегда вызывает боль ^^ Также, когда вы его создаете, попытайтесь отследить, как передается ваша информация, не стесняйтесь помещать печать везде, чтобы увидеть, как аргументы передаются в пользовательском интерфейсе.
Какое значение сгенерировано ползунком?