Нужна помощь в создании кнопок для циклов при вводе числа - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь сделать кнопку в Maya, используя Python, чтобы при вводе числа цикл for повторялся много раз.Например, я бы поставил 5 в поле, чтобы цикл for повторял цикл 5 раз, в результате чего получилось бы 50 кубов, поскольку он для i находится в диапазоне (1,10).

Это мой код:

import maya.cmds as cmds
import random
handle = "cubeUI"
if cmds.window(handle, exists=True):
    print ("deleting old window...\n")
       cmds.deleteUI(handle)

cmds.window(handle, title = "make random cubes")
cmds.columnLayout()
cmds.text(label = "amount")
amount_range_text_field = cmds.intField()
cmds.button(label = "random cube", command = "giveMeCube()")
cmds.showWindow(handle)


def giveMeCube():
   cmds.polyCube()
   amount_range = cmds.intField( amount_range_text_field, query=True, value = True )
   for i in range (1,10):
     print i
       temp = cmds.polyCube()
    cmds.xform(temp, t = (random.uniform(-1 *amount_range, amount_range), 
    random.uniform(-1 * amount_range, amount_range), random.uniform(-1  * 
    amount_range, amount_range) ) )

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Мой ответ немного сложен, ответ Green Cell должен работать на вас.Вот пример того, как вы должны думать, что ваши скрипты более «чисты». Я поместил аннотацию, чтобы понять, почему это

import maya.cmds as cmds
# This module can pass data throughts ui
from functools import partial
import random

# your function that have the amount set as variable that you can set easily : 
# giveMeCube(2) result into 20 cubes
def giveMeCube(amount_range = 1):
    nb  = amount_range * 10
    for i in range (nb):
        print(i)
        temp = cmds.polyCube()
        cmds.xform(temp, t = (random.uniform(-1 *amount_range, amount_range), 
        random.uniform(-1 * amount_range, amount_range), random.uniform(-1  * 
        amount_range, amount_range) ) )

# this function is just to separate your function from ui control
# so if you want to use giveMeCube in command line or in another script, you don't have your ui polluting the function
# *args is here because the command flag from maya ui give a default True as last argument that need to be dismissed
# most of the time, im putting the intfield query in another function
def uiGiveMeCube(fieldname, *args):
    amount = cmds.intField(fieldname, q=True, value=True)
    giveMeCube(amount)

def showUI():
    handle = "cubeUI"
    if cmds.window(handle, exists=True):
        print ("deleting old window...\n")
        cmds.deleteUI(handle)

    cmds.window(handle, title = "make random cubes")
    cmds.columnLayout()
    cmds.text(label = "amount")
    amount_range_text_field = cmds.intField(value=1, min=1)
    # you should not use string to set your function
    # you could have write : cmds.button(label = "random cube", command = giveMeCube)
    # so how partial is used : partial(function, argument1, argument2, ...etc)
    cmds.button(label = "random cube", command = partial(uiGiveMeCube, amount_range_text_field))
    cmds.showWindow(handle)

showUI()
0 голосов
/ 20 марта 2019

Вы уже получили значение от своего счетчика в переменной amount_range, поэтому просто используйте его в другом цикле.Вы также можете удалить cmds.polyCube() в начале вашей функции, так как для этого нет причин.Ваш цикл for фактически повторяется 9 раз прямо сейчас, вместо этого просто измените его на for i in range(10), и это будет повторяться 10 раз.Вам также нужно сделать отступ последней части кода, чтобы он был в цикле for.

import maya.cmds as cmds
import random


handle = "cubeUI"
if cmds.window(handle, exists=True):
    print ("deleting old window...\n")
    cmds.deleteUI(handle)

cmds.window(handle, title = "make random cubes")
cmds.columnLayout()
cmds.text(label = "amount")
amount_range_text_field = cmds.intField()
cmds.button(label = "random cube", command = "giveMeCube()")
cmds.showWindow(handle)


def giveMeCube():
    # Remove cube creation that was here.

    amount_range = cmds.intField(amount_range_text_field, query=True, value=True)

    for j in range(amount_range): # Use your spinner value to loop x many times.
        for i in range(10):  # Just need to specify max count to get the proper amount.
            print i
            temp = cmds.polyCube()
            cmds.xform(temp, t = (random.uniform(-1 *amount_range, amount_range), 
            random.uniform(-1 * amount_range, amount_range), random.uniform(-1  * 
            amount_range, amount_range)))
...