2016-09-08 4 views
0

У меня есть приложение C#, которое связывается с Autodesk Maya с использованием TCP-соединения. Майя действует как сервер, и мое приложение действует как хост.Отправка данных от Autodesk Maya во внешнее приложение с использованием commandPort (скрипты 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# или есть способ отправить значение флага из Maya в приложение C# через commandPort?

Любые идеи были бы оценены!

ответ

0

я изменил некоторые детали для Mayas стороны

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() 

вам нужен на самом деле не в «\ п», то разделяющий делаются simicolon: Connection.sendData(String.Format("if FLAG: cmds.dolly(10,20,30) else cmds.warning('press Start')")); вы также можете создать узел и добавить пользовательский Attr и писать флаг, начинающийся или близкий, чем вы читаете флаг как attr (вы можете изменить это очень просто и удобно без каких-либо ui):

Connection.sendData(String.Format("if cmds.getAttr('{0}.type'.format('hermes_node')): cmds.dolly(10,20,30)")); 
Смежные вопросы