2016-09-08 1 views
0

J'ai implémenté une application C# qui communique avec Autodesk Maya en utilisant une connexion TCP. Maya agit en tant que serveur et mon application agit en tant qu'hôte.Envoyer des données d'Autodesk Maya à une application externe en utilisant commandPort (script python)

Le script python qui est exécuté dans Maya est -

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) 

J'ai écrit une application TCPClient C# (qui fonctionne parfaitement bien). Les données envoyées par l'application ressemblent à ceci. Le problème avec cette instruction est que la variable d'indicateur qui a été déclarée dans le script python n'est pas reconnue ici. Quand je dis simplement cmds.dolly (10,20,30) cette commande est parfaitement exécutée. Maintenant, ma question est de savoir comment rendre la variable flag visible à mon application C# OU y a-t-il un moyen d'envoyer la valeur de flag de Maya à l'application C# via commandPort?

Toutes les idées seraient appréciées!

Répondre

0

i changé quelques pièces pour mayas côté

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

vous ne devez pas vraiment le « \ n », le séparer le Nuevo se fait par simicolon: Connection.sendData(String.Format("if FLAG: cmds.dolly(10,20,30) else cmds.warning('press Start')")); vous pouvez également créer un nœud et ajouter un attr personnalisé et écrire le drapeau par le début ou la fin que vous lisez le drapeau comme attr (vous pouvez changer cela vraiment facile et convivial sans aucun ui) comme:

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