Как исправить неопределенный метод в простом классе в Python для сценария Maya? - PullRequest
0 голосов
/ 09 апреля 2019

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

Когда я помещаю их в класс и пытаюсь запустить код, я получаю сообщение об ошибке:

Ошибка: NameError: строка файла 10: глобальное имя 'runSelected'не определено #

Я подумал, что это может быть из-за того, что я вызывал методы, у которых не было self. перед ними.Я попытался сделать это, хотя и все еще получаю сообщение об ошибке:

Ошибка: NameError: строка файла 35: глобальное имя 'self' не определено #

Скрипт запускается после выбора двух объектов в трехмерном пространстве в Maya и запускается с помощью команды:

Align()

Код для класса ниже:

#Class for snapping one object to another in Maya.

import maya.cmds as mc


class Align(object):

    def __init__(self):
        #starts the runSelected Method
        self.runSelected()       

    def selectionCheck(mySel):
        #checks that 2 ojects are created, returns True if so, Flase if not.
        if len(mySel) == 2:   
           print "Great! Two selected"  
           return True

        elif len(mySel) == 0: 
           print "Nothing Selected to constrain!"
           return False   

    def createWindow():
        #This creates a simple dialogue window that gives a message.
        mc.confirmDialog(title='Align Objects', m ="Instructions: You need to select two objects to constrain.")

    def runConstrainDelete(mySel):
        #Creates a parent constraint, does not maintain offset and then deletes the constraint when object is moved.Clears selection.
        myParentConstraint = mc.parentConstraint(mySel[0], mySel[1], mo=False)
        mc.delete(myParentConstraint)
        mc.select (clear=True)

    def runSelected(object):
        #Creates a list of objects selected. Runs selection check
        mySel = mc.ls(sl =True)
        result_Sel_Check = self.selectionCheck(mySel)

        #if statement handles if a warning window or the rest of the script should be run.
        if result_Sel_Check == False:
            self.createWindow()    
        else:
            self.runConstrainDelete(mySel)


test_Align = Align()

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

При создании класса вы должны включить self в качестве первого параметра для каждой функции внутри него (если вы не пытаетесь использовать класс или статические методы). Это довольно хорошее объяснение о том, как использовать self с классами.

Вы также забыли передать параметр для self.runSelected в вашем __init__!

Кажется, это работает как ожидалось:

#Class for snapping one object to another in Maya.

import maya.cmds as mc


class Align(object):

    def __init__(self):
        #starts the runSelected Method
        self.runSelected(cmds.ls(sl=True))  # Forgot to pass a parameter here.       

    def selectionCheck(self, mySel):
        #checks that 2 ojects are created, returns True if so, Flase if not.
        if len(mySel) == 2:   
           print "Great! Two selected"  
           return True

        elif len(mySel) == 0: 
           print "Nothing Selected to constrain!"
           return False   

    def createWindow(self):
        #This creates a simple dialogue window that gives a message.
        mc.confirmDialog(title='Align Objects', m ="Instructions: You need to select two objects to constrain.")

    def runConstrainDelete(self, mySel):
        #Creates a parent constraint, does not maintain offset and then deletes the constraint when object is moved.Clears selection.
        myParentConstraint = mc.parentConstraint(mySel[0], mySel[1], mo=False)
        mc.delete(myParentConstraint)
        mc.select (clear=True)

    def runSelected(self, object):
        #Creates a list of objects selected. Runs selection check
        mySel = mc.ls(sl =True)
        result_Sel_Check = self.selectionCheck(mySel)

        #if statement handles if a warning window or the rest of the script should be run.
        if result_Sel_Check == False:
            self.createWindow()    
        else:
            self.runConstrainDelete(mySel)


test_Align = Align()

Кстати, если вы используете Maya 2016 и выше, вы можете использовать cmds.matchTransform для выравнивания объектов.Также будут приняты во внимание смещенные точки.В противном случае вы можете использовать cmds.xform для выравнивания объектов.Старайтесь избегать создания родительских ограничений для выравнивания, так как это снизит производительность, а затем вам придется беспокоиться об очистке сцены.

1 голос
/ 09 апреля 2019

При определении метода экземпляра вам нужно явно передать self в качестве первого параметра метода. Например def runSelected(object): следует изменить на def runSelected(self, object):, только тогда вы можете получить доступ к self в теле метода. Вы должны изучить Python self и методы экземпляра, чтобы получить некоторую интуицию.

0 голосов
/ 09 апреля 2019

Каждый метод класса, использующий self, должен иметь self в списке параметров. Другие, такие как createWindow, runConstrainDelete и selectionCheck, должны быть статическими методами (или определены вне класса).

...