无法从for循环内部调用方法?

时间:2018-07-15 17:27:40

标签: python

我现在真的不为什么不能从我的for循环内部调用方法setTRSKey。我想念什么吗?这对我完全没有意义。 Pycharm将其声明为未解决的引用

代码如下:

import math
import nuke

originNode = nuke.selectedNode()
world_matrix = originNode['world_matrix']  # this is an iArray Knob with 16 fields
mResult = nuke.math.Matrix4()  # Matrix to copy iArray to

# Ask user for Frame Range operation
ret = nuke.getFramesAndViews('Frame range', '%s-%s' % (nuke.root().firstFrame(), nuke.root().lastFrame()))

if ret != None:

    nuke.nodeCopy("%clipboard%")  # creating node duplicate
    originNode.setSelected(False)
    newNode = nuke.nodePaste("%clipboard%")  # creating origin node duplicate
    newNode['translate'].clearAnimated()
    newNode['translate'].setValue(0)
    newNode['translate'].setAnimated()
    newNode['rotate'].clearAnimated()
    newNode['rotate'].setValue(0)
    newNode['rotate'].setAnimated()
    newNode['scaling'].clearAnimated()
    newNode['scaling'].setValue(0)
    newNode['scaling'].setAnimated()

    frange = nuke.FrameRange(ret[0])  # convert to frange object
    for frame in frange:
        for i in xrange(0, 16):
            mResult[i] = world_matrix.valueAt(frame)[i]

        mResult.transpose()  # row become columns and vice versa
        mTranslate = nuke.math.Matrix4(mResult)
        mTranslate.translationOnly()
        mRotate = nuke.math.Matrix4(mResult)
        mRotate.rotationOnly()
        mScale = nuke.math.Matrix4(mResult)
        mScale.scaleOnly()

        translate = (mTranslate[12], mTranslate[13], mTranslate[14])
        rotateRad = mRotate.rotationsZXY()
        rotate = (math.degrees(rotateRad[0]), math.degrees(rotateRad[1]),
                  math.degrees(rotateRad[2]))  # convert from radiants to defrees
        scale = (mScale.xAxis().x, mScale.yAxis().y, mScale.zAxis().z)

        setTRSKey(frame, translate, rotate, scale)
else:
    print "User canceled the operation"

def setTRSKey(frame, translate, rotate, scale):
    print type(translate(0))

    newNode['translate'].setValueAt(translate(0), frame, 0)
    newNode['translate'].setValueAt(translate(1), frame, 1)
    newNode['translate'].setValueAt(translate(2), frame, 2)

edit:带有在定义之前调用 loadDataFromScript 的类的示例

class Connecthor(QtWidgets.QDialog, Ui_Dialog):
#
allowedNodes = ["Read", "Write", "Merge", "Keymix", "ChannelMerge", "Roto", "RotoPaint", "Copy", "Shuffle", "PostageStamp", "Camera", "Camera2", "ScanlineRender", "Connector", "ReadGeo", "ReadGeo2", "BackdropNode"]
script_path = os.path.dirname(os.path.realpath(__file__))

#constructor
def __init__(self, parent=None):
    super(Connecthor, self).__init__(parent)
    self.setupUi(self)
    self.setFixedSize(self.size())
    #self.setWindowOpacity(0.95)
    popupmenu = QtWidgets.QMenu(self.btn_settings)
    #popupmenu.addAction("save links for script", self.writeListDictToJson)
    #popupmenu.addAction("import links from json", self.readJsonToDict)
    popupmenu.addAction("save links for script (manual)", self.saveDatatoScript)
    popupmenu.addAction("settings", self.opensetting)
    self.btn_settings.setMenu(popupmenu)
    self.btn_settings.setIcon(QtGui.QIcon(os.path.join(iconpath, "settings.png")))
    self.btn_addSelectedNodes.setIcon(QtGui.QIcon(os.path.join(iconpath, "add.png")))
    self.btn_addSelectedNodes.clicked.connect(self.addSelectedNodes)

    # #Loading test Json
    #self.readJsonToDict()
    self.loadDataFromScript()

1 个答案:

答案 0 :(得分:2)

在Python中,必须先定义函数,然后才能调用它们。将setTRSKey定义移至for循环上方。一般而言,函数定义是导入后文件中的头几件事,尽管并非总是如此。