имя не определено во время импорта - PullRequest
0 голосов
/ 25 марта 2020

Я сталкиваюсь с проблемой, которую не могу понять ... Вот часть исходного кода для автоматической установки:

def Legs():
    Vleg = cmds.intSliderGrp('legs', q=True ,v=True)
    if Vleg == 1:
        Leg01 = cmds.intSliderGrp('Leg1', l= 'Sym. Limb no.1', min=0, max=8, f=True)
    elif Vleg == 2:
        Leg01 = cmds.intSliderGrp('Leg1', l= 'Sym. Limb no.1', min=0, max=8, f=True)
        Leg02 = cmds.intSliderGrp('Leg2', l= 'Sym. Limb no.2', min=0, max=8, f=True)
    elif Vleg == 3:
        Leg01 = cmds.intSliderGrp('Leg1', l= 'Sym. Limb no.1', min=0, max=8, f=True)
        Leg02 = cmds.intSliderGrp('Leg2', l= 'Sym. Limb no.2', min=0, max=8, f=True)
        Leg03 = cmds.intSliderGrp('Leg3', l= 'Sym. Limb no.3', min=0, max=8, f=True)
    else :
        Leg01 = cmds.intSliderGrp('Leg1', l= 'Sym. Limb no.1', min=0, max=8, f=True)
        Leg02 = cmds.intSliderGrp('Leg2', l= 'Sym. Limb no.2', min=0, max=8, f=True)
        Leg03 = cmds.intSliderGrp('Leg3', l= 'Sym. Limb no.3', min=0, max=8, f=True)
        Leg04 = cmds.intSliderGrp('Leg4', l= 'Sym. Limb no.4', min=0, max=8, f=True)


win = 'win'
win = cmds.window(win, s=True, t = 'Auto-rig Prototype')
cmds.showWindow(win)
cmds.columnLayout(adj=True)
cmds.separator(h = 5 )
cmds.intSliderGrp ('legs', l = 'Number of symetrical parts', min=1, max=4, v=1, f=True)
cmds.separator(h = 5 )
cmds.text(l='please execute commands in the APPROPRIATE order')
cmds.separator(h = 5 )
cmds.button (l = '1 : Set', c = 'Legs()')
cmds.separator(h = 5 )
cmds.button (l = '2 : Create Guides', c = 'Guide()')
cmds.separator(h = 5 )
cmds.button( l= '3 : Set Rig', c= 'rig()')
cmds.separator(h = 5 )
cmds.button( l= '4 : Set CTRLS', c= 'ctrl()')
cmds.separator(h = 5 )
cmds.button( l= '5 : Parent CTRLS', c= 'Par()')
cmds.separator(h = 5 )
cmds.button (l = 'Delete selection and unused nodes', c = 'Suppr()')

Когда я запускаю этот scirpt в одиночку, все работает как ожидал, но потом я попытался импортировать его

import maya.cmds as cmds
import maya.mel as mel
def printNewMenuItem( item ):
    if item == 'Arachnoid':
        if cmds.window(InitWin, exists = True):
            cmds.deleteUI(InitWin)
        import SpidRig
    else :
        print str(item) + ' : this command is not scripted yet'
InitWin = cmds.window(t='Choose your rig')
if cmds.window(InitWin, exists = True):
    cmds.deleteUI(InitWin)
cmds.window(t='Choose your rig')
cmds.columnLayout()
cmds.optionMenu( label='Rig Type', changeCommand=printNewMenuItem)
cmds.menuItem( label='Basic Humanoid' )
cmds.menuItem( label='Arachnoid' )
cmds.menuItem( label='Bird' )
cmds.showWindow( InitWin )

И теперь, в зависимости от времени, либо окно 'Auto-rig Prototype' никогда не открывается, либо он возвращает мне эту ошибку:

# Error: NameError: file <maya console> line 1: name 'Legs' is not defined # 

что я делаю не так?

1 Ответ

0 голосов
/ 25 марта 2020

попробуйте удалить строку из ваших команд:

cmds.button (l = '1 : Set', c = Legs)

и напишите вашу команду следующим образом:

def Legs(*args):
    Vleg = cmds.intSliderGrp('legs', q=True ,v=True)
    ...

запустить с fre sh maya, перезапустив и затем мы сможет отлаживать. Кажется, это проблема пространства имен / import / global var и local var

, подобная этой ошибке:

# Error: NameError: file <maya console> line 1: name 'Legs' is not defined # 

, это означает, что при нажатии на эту кнопку:

cmds.button (l = '1 : Set', c = 'Legs()')

он пытается выполнить c эту буквальную команду. Но, zhen вы импортируете это так:

import leg_script

вы импортируете его с пространством имен: leg_script например, если вы импортируете так:

import leg_script as leg

пространство имен: leg

в этих двух случаях ваш Leg pro c теперь записан буквально leg_script.Leg() или leg.Leg()

Вы можете избавиться от пространства имен, используя:

from leg_script import *

, но это плохая практика, потому что отладка вашего скрипта станет действительно трудной.


Итак, подведем итог проблемы, когда вы пишете литеральные строки в команде:

cmds.button (l = '1 : Set', c = 'Legs()')

ваш скрипт вызывает проблемы с импортом, если вы хотите игнорировать проблемы с пространством имен:

cmds.button (l = '1 : Set', c = Legs)

, что означает go, в противном случае вы бы записали пространство имен в строку:

cmds.button (l = '1 : Set', c = 'leg_script.Legs()')

но он не будет работать локально и далее, только если он вызывается с этим пространством имен .... так что не делайте этого!

...