Как написано self.MinAndMax
- текстовое поле;даже если вы получите значение из него, это будет строка, и вы не сможете проиндексировать ее, чтобы получить отдельные элементы - и ваша индексация будет сброшена, если любое из чисел будет отрицательным или будет иметь десятичные дроби. Ленивое решение - использовать FloatFieldGrp
, который позволяет вам иметь 2-4 цифровых входа. Немного раздражает сразу получить все значения (посмотрите, как это делается ниже), но это позволит избежать многих проблем при попытке разобрать текстовое поле.
Кроме того, эта строка не имеет смысла в контексте:
cmds.intField(self.moveMin, self.moveMax, self.rotMin, self.rotMax, self.scaleMin, self.scaleMax, e=True, text='')
Вы не видите ошибку, потому что она терпит неудачу в предыдущей строке, но первый аргумент должен бытьимя существующего intField
.
В любом случае, я бы немного реорганизовал это, чтобы исключить разбор аргументов из функции разброса, чтобы вы могли отделить рабочую логику от логики разбора пользовательского интерфейса. Намного легче будет определить, где что-то пошло не так:
import random
import maya.cmds as cmds
class TestGUI(object):
def __init__(self):
self.window = cmds.window()
self.layout = cmds.rowLayout(nc=3)
self.min_xyz = cmds.floatFieldGrp( numberOfFields=3, label='min', value1=-10, value2=-10, value3=-10 )
self.max_xyz= cmds.floatFieldGrp( numberOfFields=3, label='min', value1=10, value2=10, value3=10 )
cmds.button(label='scatter', c = self.scatter)
cmds.showWindow(self.window)
def scatter(self, *_):
selected = cmds.ls(sl=True)
if not selected:
cmds.warning("select something")
return
min_xyz = (
cmds.floatFieldGrp(self.min_xyz, q=True, v1=True),
cmds.floatFieldGrp(self.min_xyz, q=True, v2=True),
cmds.floatFieldGrp(self.min_xyz, q=True, v3=True)
)
max_xyz = (
cmds.floatFieldGrp(self.max_xyz, q=True, v1=True),
cmds.floatFieldGrp(self.max_xyz, q=True, v2=True),
cmds.floatFieldGrp(self.max_xyz, q=True, v3=True)
)
print "scatter settings:", min_xyz, max_xyz
rand_scatter(selected, min_xyz, max_xyz)
def rand_scatter(selection, min_xyz, max_xyz):
dupe_count = random.randint(1, 10)
duplicates = [cmds.duplicate(selection) for n in range(dupe_count)]
for dupe in duplicates:
destination = [random.randint(min_xyz[k], max_xyz[k]) for k in range(3)]
cmds.xform(dupe, t=destination, absolute=True)
print (dupe, destination)
t = TestGUI() # shows the window; hit 'scatter' to test
Моя версия немного меняет вашу логику - вы дублировали свой список выбора, что приводило к тому, что количество элементоврасти в геометрической прогрессии (поскольку каждое дублирование также дублирует предыдущие дубликаты). Я не уверен, соответствует ли это вашему намерению или нет.
Вы можете избежать лишних лямбд, добавив *_
в реальный обратный вызов кнопки;это незначительный раздражитель майя, что у кнопок всегда есть этот бесполезный первый аргумент.
Кроме того, я бы постарался не выполнять импорт внутри тел функций. Если импортированный модуль недоступен, лучше знать, когда этот файл импортируется, а не только когда пользователь нажимает кнопку - гораздо легче обнаружить отсутствующий модуль, если выполнить все операции импорта в блоке вверху. .