【问题标题】:Sending data from Autodesk Maya to an external application using commandPort (python scripting)使用 commandPort(python 脚本)将数据从 Autodesk Maya 发送到外部应用程序
【发布时间】:2016-09-10 04:30:19
【问题描述】:

我已经实现了一个 C# 应用程序,它使用 TCP 连接与 Autodesk Maya 进行通信。 Maya 充当服务器,我的应用程序充当主机。

在 Maya 中执行的 python 脚本是 -

import socket
import maya.cmds as cmds
flag = None
cmds.commandPort(name = "localhost:7777", stp = "python")

def start():
  global flag
  flag = True

def stop():
  global flag 
  flag = False

def close():
  cmds.commandPort(name = "localhost:7777", close = True)

windowZ = cmds.window(title="Object Navigate", w= 350)
cmds.columnLayout(adjustableColumn = True)

startbtn= cmds.button(label = "Start", c = "start()")
stopbtn= cmds.button(label = "Stop", c = "stop()")
closebtn= cmds.button(label = "close", c = "close()")

cmds.showWindow(windowZ)

我编写了一个 TCPClient C# 应用程序(运行良好)。应用程序发送的数据如下所示。

Connection.sendData(String.Format("if flag:\n" + "\tcmds.dolly(10,20,30)"));

这个语句的问题是在python脚本中声明的标志变量在这里不被识别。当我只是说 cmds.dolly(10,20,30) 时,这个命令会完美执行。

现在,我的问题是如何使 flag 变量对我的 C# 应用程序可见,或者有没有办法通过 commandPort 将 flag 的值从 Maya 发送到 C# 应用程序?

任何想法将不胜感激!

【问题讨论】:

    标签: c# python sockets tcpclient maya


    【解决方案1】:

    我为玛雅人改变了一些部分

    import socket
    import maya.cmds as cmds
    from functools import partial
    FLAG = None
    class Hermes(object):
        def __init__(self, **kwargs):
            self.host_id = kwargs['host_id']
            cmds.commandPort(name = "localhost:{0}".format(self.host_id), stp = "python")
    
        def delete_win(self, **kwargs):
            if cmds.window(kwargs["win_id"], q=True, exists=True):
               cmds.deleteUI(kwargs["win_id"], window=True)
    
        def submitter(self, **kwargs):
            mod = globals()['Hermes']()
            meth = getattr(mod , kwargs['method'])
            #your flag 
            FLAG = meth()             
    
        def start(self, flag = True, *args):
            return flag
    
        def stop(self, flag = False, *args): 
            return flag
    
        def close(self, *args):
            cmds.commandPort(name = "localhost:{0}".format(self.host_id), close = True)
    
        def hermes_ui(self, *args):
            delete_win(win_id = "windowZ")
            toll_ui = {}
            toll_ui["windowZ"] = cmds.window("windowZ", title="Object Navigate", w= 350)
            toll_ui["main_pan"] = cmds.paneLayout( configuration='quad', parent =  toll_ui["windowZ"])
            toll_ui["start_btn"]= cmds.button(label = "Start", parent = toll_ui["main_pan"], c = partial(self.submitter, method = "start"))
            toll_ui["stop_btn"]= cmds.button(label = "Stop", parent = toll_ui["main_pan"],c = partial(self.submitter, method = "stop"))
            toll_ui["close_btn"]= cmds.button(label = "close", parent = toll_ui["main_pan"],c = partial(self.submitter,method = "close"))
    
            cmds.showWindow(toll_ui["windowZ"])
    
    
    def run(*args):
        hrm = Hermes(host_id = '7777')
        hrm.hermes_ui()
    

    你不需要真正的'\n',分隔是由simicolon完成的:Connection.sendData(String.Format("if FLAG: cmds.dolly(10,20,30) else cmds.warning('press Start')")); 您还可以创建一个节点并添加一个自定义 attr 并通过 start 或 close 写入标志,而不是将标志读取为 attr(您可以在没有任何 ui 的情况下非常简单和友好地更改它),例如:

    Connection.sendData(String.Format("if cmds.getAttr('{0}.type'.format('hermes_node')): cmds.dolly(10,20,30)"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      相关资源
      最近更新 更多