Создание пользовательского интерфейса в Maya с использованием сценариев Python - PullRequest
2 голосов
/ 08 августа 2010

Я создаю пользовательский интерфейс внутри Maya с использованием Python, и я застрял на этой ошибке, которая возникает в этой строке:

parts = button2.split(",") # NameError: global name 'button2' is not defined 

Вот мой скрипт:

import maya.cmds as cmds

def createMyLayout():
    window = cmds.window(widthHeight=(1000, 600), title="lalala",   resizeToFitChildren=1)
    cmds.rowLayout("button1, button2, button3", numberOfColumns=5)

    cmds.columnLayout(adjustableColumn=True, columnAlign="center", rowSpacing=10)

    button2 = cmds.textFieldButtonGrp(label="LocatorCurve",
                                    text="Please key in your coordinates",
                                    changeCommand=edit_curve,
                                    buttonLabel="Execute",
                                    buttonCommand=locator_curve)
    cmds.setParent(menu=True)

    cmds.showWindow(window)

def locator_curve(*args):
    # Coordinates of the locator-shaped curve.
    crv = cmds.curve(degree=1,
                 point=[(1, 0, 0),
                        (-1, 0, 0),
                        (0, 0, 0),
                        (0, 1, 0),
                        (0, -1, 0),
                        (0, 0, 0),
                        (0, 0, 1),
                        (0, 0, -1),
                        (0, 0, 0)])


    return crv

def edit_curve(*args):
    parts = button2.split(",")
    print parts


createMyLayout()    

По сути, мой скрипт пытается создать пользовательский интерфейс с кнопками внутри, которые делают вещи.В этом случае я пытаюсь создать кнопку текстового поля, которую пользователь вводит в набор координат, а кривая на основе локатора создается в соответствии с заданным набором координат.Однако мне удалось создать только кнопку, которая создает кривую по умолчанию.Может кто-нибудь сказать мне, как идти о создании кнопки, которая учитывает, какие координаты человек дает и выводит конкретную кривую?

Ответы [ 2 ]

3 голосов
/ 22 июня 2013

Вы можете использовать глобальные переменные, но более элегантный способ - реализовать класс.

Вот пример того, как решить эту проблему с классом. Обратите внимание, что мы используем self.button2 вместо button2. Это делает его переменной экземпляра класса и доступно в других функциях, в то время как button2 является локальной переменной и более недоступен при выходе из функции.

import maya.cmds as cmds

class createMyLayoutCls(object):
    def __init__(self, *args):
        pass
    def show(self):
        self.createMyLayout()
    def createMyLayout(self):
        self.window = cmds.window(widthHeight=(1000, 600), title="lalala",   resizeToFitChildren=1)
        cmds.rowLayout("button1, button2, button3", numberOfColumns=5)

        cmds.columnLayout(adjustableColumn=True, columnAlign="center", rowSpacing=10)

        self.button2 = cmds.textFieldButtonGrp(label="LocatorCurve",
                                        text="Please key in your coordinates",
                                        changeCommand=self.edit_curve,
                                        buttonLabel="Execute",
                                        buttonCommand=self.locator_curve)
        cmds.setParent(menu=True)

        cmds.showWindow(self.window)

    def locator_curve(self,*args):
        # Coordinates of the locator-shaped curve.
        crv = cmds.curve(degree=1,
                     point=[(1, 0, 0),
                            (-1, 0, 0),
                            (0, 0, 0),
                            (0, 1, 0),
                            (0, -1, 0),
                            (0, 0, 0),
                            (0, 0, 1),
                            (0, 0, -1),
                            (0, 0, 0)])
        return crv

    def edit_curve(self,*args):
        parts = self.button2.split(",")
        print parts
        txt_val = cmds.textFieldButtonGrp(self.button2, q=True,text=True)
        print txt_val


b_cls = createMyLayoutCls()  
b_cls.show()

И я знаю, что уже слишком поздно отвечать, и вы наверняка уже будете мастером в python;)

Надеюсь, это поможет кому-то еще:)

0 голосов
/ 05 мая 2011

Чтобы разделить переменную между функциями, такими как «button2», вам нужно объявить ее как «глобальную».Сейчас каждая из двух функций создает переменную button2 отдельно, и они не могут видеть друг друга.

Итак, для начала объявите переменную в глобальной области видимости вне функции.Затем объявите его снова внутри любой функции, которую вы хотите использовать, и затем вы можете использовать ее как обычную переменную.

global myVar
myVar = 1

def test1():
    global myVar
    print myVar
    myVar += 1

def test2():
    global myVar
    print myVar
    myVar += 1
    print myVar

test1()
test2()

# output:
# 1
# 2
# 3

Что касается форматирования строки ввода, похоже, вы на правильном пути- Я просто объявил button2 глобально, затем добавил глобальные объявления button2 внутри каждой функции, и я получил вашу кривую локатора просто отлично.

...