【问题标题】:MAXscript Listener can not run PysideMAXscript Listener 无法运行 Pyside
【发布时间】:2015-02-07 04:53:33
【问题描述】:

请帮帮我!

我正在用 Python 创建 GUI,可以在 3Ds Max 上运行,我听说有人说我必须使用 Pyside 来制作它。到目前为止一切都很好。

这是我的代码:

import sys
from PySide import QtGui
from PySide.QtGui import *
from PySide.QtCore import *

class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.setMinimumHeight(660)
        self.setMinimumWidth(700)
        self.setMaximumHeight(660)
        self.setMaximumWidth(700)

        grid = QtGui.QGridLayout()
        grid.addWidget(self.First(), 0,0,2,0)


        self.setLayout(grid)

        self.setWindowTitle("Library")
        self.resize(700, 660)

    def First(self):
        groupBox = QtGui.QFrame()
        groupBox.setMaximumWidth(230)
        groupBox.setMaximumHeight(700)

        lbRenderer = QtGui.QLabel("Renderer :",self)
        lbFolders = QtGui.QLabel("Folders :",self)

        cbRenderer = QtGui.QComboBox(self)
        cbRenderer.addItem("Vray")
        cbRenderer.addItem("Octane")

        lvFolders = QtGui.QListView(self)
        lvFolders.setMaximumWidth(220)
        lvFolders.setMaximumHeight(500)

        btnAddNewObject = QtGui.QPushButton('Add New Objects',self)
        btnNewSet = QtGui.QPushButton('New Set',self)


        vbox = QtGui.QGridLayout()
        vbox.addWidget(lbRenderer,0,0)
        vbox.addWidget(cbRenderer,0,1,1,3)
        vbox.addWidget(lbFolders,2,0,1,4)
        vbox.addWidget(lvFolders,3,0,1,4)
        vbox.setColumnStretch(1, 1)
        vbox.addWidget(btnAddNewObject,4,0,1,2)
        vbox.addWidget(btnNewSet,4,3)


        groupBox.setLayout(vbox)
        return groupBox

app = QApplication.instance()
if app is None:
    app = QApplication(sys.argv)
    clock = Window()
    clock.show()
app.exec_()

我尝试了另一个与我的代码相同的代码,它通过“MAXScript Listener”运行良好。但是我不知道为什么当我尝试运行它时,它什么也没有出现(我的 GUI,或者 Alert 是我的代码不好)。

【问题讨论】:

    标签: python-2.7 pyside 3dsmax maxscript


    【解决方案1】:

    首先 - 你初始化你的脚本错误,你调用'initialize'函数返回#Success(意味着python初始化正确), 但是,您只需发送一个字符串(这是文件的路径),这什么都不做。 你必须使用的是:

     python.ExecuteFile "C:\\Program Files\\Autodesk\\3ds Max 2015\\scripts\\Python\\yourPythonScript.py"
    

    在 maxscript 监听器\编辑器中。

    Autodesk 文档说:

    Autodesk 3ds Max 附带 PySide 1.2 的预构建版本 与 Python 2.7.3 兼容。该版本包括以下内容 模块子集:

    QtCore
    QtGui
    QtNetwork
    QtOpenGL
    QtSql
    QtSvg
    QtTest
    QtWebKit
    QtXml
    

    他们提供了一个简单的示例脚本,您可以运行它,将其保存在 python 文件中,然后使用开头提到的命令正确执行它。

    代码在这里:

    from PySide import QtGui
    import MaxPlus
    
    class _GCProtector(object):
        widgets = []
    
    def make_cylinder():
        obj = MaxPlus.Factory.CreateGeomObject(MaxPlus.ClassIds.Cylinder)
        obj.ParameterBlock.Radius.Value = 10.0
        obj.ParameterBlock.Height.Value = 30.0
        node = MaxPlus.Factory.CreateNode(obj)
        time = MaxPlus.Core.GetCurrentTime()
        MaxPlus.ViewportManager.RedrawViews(time)
    
        return
    
    app = QtGui.QApplication.instance()
    if not app:
        app = QtGui.QApplication([])
    
    def main():     
        MaxPlus.FileManager.Reset(True)
        w = QtGui.QWidget()
        w.resize(250, 100)
        w.setWindowTitle('Window')
        _GCProtector.widgets.append(w)
        w.show()
    
        main_layout = QtGui.QVBoxLayout()
        label = QtGui.QLabel("Click button to create a cylinder in the scene")
        main_layout.addWidget(label)
    
        cylinder_btn = QtGui.QPushButton("Cylinder")
        main_layout.addWidget(cylinder_btn)
        w.setLayout(main_layout)
    
        cylinder_btn.clicked.connect(make_cylinder)
    
    if __name__ == '__main__':
        main()
    

    他们还提到了这一点,这很重要:

    通常在脚本中使用创建 PySide 应用程序对象 QtGui.QApplication()。但是,在 3ds Max 中,已经有一个 PySide 应用程序正在运行,因此您可以像这样获得该对象的句柄:

    QtGui.QApplication.instance()
    

    将其用作启动脚本,并将您的 GUI 项目移植到该脚本中,它应该可以让您启动并运行。

    【讨论】:

    • 非常感谢,但是当我把我的代码放到上面的代码中时,它告诉代码是成功的,有屏幕,但里面没有任何功能。
    【解决方案2】:

    我试图修复您的代码,但发生了任何事情,我不知道为什么。 首先,我打开了您的代码并在 Pycharm 中运行它,但它无法运行。但它完全在 Maxscript Listener 中运行,你能给我解释一下吗?

    其次,我尝试修复您的代码。都是一样的,我可以在Maxscript上运行,但是里面的内容和功能都消失了。

    这是我的代码

    from PySide import QtGui
    import MaxPlus
    
    class _GCProtector(object):
        widgets = []
    
    
    app = QtGui.QApplication.instance()
    if not app:
        app = QtGui.QApplication([])
    
        def main():
            MaxPlus.FileManager.Reset(True)
            w = QtGui.QWidget()
            w.setWindowTitle('Window')
            _GCProtector.widgets.append(w)
            w.show()
    
            main_layout = QtGui.QGridLayout()
            main_layout.addWidget(First(),0,0)
            main_layout.addWidget(Second(),0,1)
            w.setLayout(main_layout)
    
        def First():
            groupBox = QtGui.QFrame()
            lbRenderer = QtGui.QLabel("Renderer :",self)
            vbox = QtGui.QGridLayout()
            vbox.addWidget(lbRenderer,0,0)
            groupBox.setLayout(vbox)
            return groupBox
    
        def Second():
            groupBox = QtGui.QFrame()
            lbRenderer = QtGui.QLabel("Renderer :",self)
            vbox = QtGui.QGridLayout()
            vbox.addWidget(lbRenderer,0,0)
            groupBox.setLayout(vbox)
            return groupBox
    
    if __name__ == '__main__':
        main()
    

    这是来自 Maxcript 的警报

    【讨论】:

    • 当您使用路径时,请记住使用双斜杠,或者将斜杠放在其他位置。像这样 "C:\\folder\\file.py" 或 "c:/folder/file.py" 我在最初的回答中忘记了这个,我现在也编辑了那个。
    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多