2017-06-30 6 views
-2

Je veux lancer un code python (fonction) dès que j'ouvrir le fichier .ma (MAYA ascii). Je peux donc éditer manuellement un fichier ma et y écrire du code python. donc ma question est comment puis-je "Embed" code python dans le fichier .MA. MEL aussi bien. un certain code de mel fonctionne, mais pas tous. Je ne comprends pas pourquoi ça arrive.fonction Python dans Maya fichier ascii

+1

Bienvenue sur StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. StackOverflow n'est pas un service de codage ou de tutorat. – Prune

+0

Dans le contexte maya, il ne s'agit en fait pas d'une question aussi minimale que cela puisse paraître. – theodox

Répondre

1

Vous ne devriez pas modifier les fichiers manuellement faire ce que vous essayez - les fichiers MA ressemblent à Mel, mais ils ne sont pas exactement les mêmes, et vous pourriez facilement briser votre scène avec une mauvaise édition.

La méthode standard pour intégrer la fonctionnalité de script dans un fichier Maya est un script node. Pour l'application que vous recherchez, vous souhaitez créer un noeud de script et le configurer pour qu'il s'exécute lorsque le fichier est ouvert dans Maya.

Le noeud de script est créé avec cmds.scriptNode(). Le noeud a deux attributs de chaîne, .before et .after; vous définissez l'un d'entre eux sur le texte du script que vous voulez exécuter. L'attribut .scriptType est un ENUM qui raconte Maya quand exécuter le script et le .sourceType indique si vous souhaitez utiliser Mel ou Python. Pour exécuter un script lorsque le fichier est ouvert dans Maya, vous utilisez généralement .scriptType sur 2, qui est "Sur l'interface graphique ouverte/fermée" et l'attribut .before (qui, un peu confus, est "beforeScript" dans les indicateurs de commande)

Ainsi, par exemple, pour imprimer « Bonjour tout le monde » quand la scène est ouverte:

sn = cmds.scriptNode(beforeScript = "print('hello world')") 
cmds.setAttr(sn + '.scriptType', 2) # gui open/close 
cmds.setAttr(sn + '.sourceType', 1) # python 

enregistrer le fichier et rouvrez, il imprimera « bonjour » à l'auditeur. Vous n'avez aucun contrôle sur l'environnement dans lequel votre fichier peut être ouvert, vous devez donc faire attention à ne pas faire d'hypothèses sur les importations disponibles, etc. Le script s'exécutera dans la portée globale, comme s'il était tapé dans l'écouteur.

mise à jour - emballage

Les commentaires indiquent que l'OP veut mettre des scripts plus complexes dans le nœud. En général maya exécutera la chaîne comme si vous lanciez exec sur la même chaîne en Python. Exec fonctionne pour les chaînes multilignes, mais vous devez les formater correctement avec les nouvelles lignes et les onglets si vous utilisez des onglets et des espaces si ce n'est pas le cas. Vous aurez également besoin d'échapper à vos citations correctement. Pour les courts scripts utilisent simplement des triples guillemets-simple pour échapper à la chose:

script = ''' 
def example(): 
    for n in range (100): 
     print ("hello world") 
example() 
''' 
import maya.cmds as cmds 
sn = cmds.scriptNode(beforeScript = script) 
cmds.setAttr(sn + '.scriptType', 2) 
cmds.setAttr(sn + '.sourceType', 1) 

Souvent, il est plus facile à lire juste un script à partir du disque et le stocker comme ceci:

def create_script_node_from_file(filename): 
    with open('filename', 'rt') as handle: 
     script_text = handle.read() 
    sn = cmds.scriptNode(beforeScript = script_text) 
    cmds.setAttr(sn + '.scriptType', 2) # gui open/close 
    cmds.setAttr(sn + '.sourceType', 1) # python 

Vous ne probablement pas vouloir faire quoi que ce soit de très intrusif ou élaborer dans un noeud de script parce que les personnes ouvrant le fichier dans le futur peuvent seulement vouloir l'inspecter et ne pas se plonger dans l'interface que vous présentez. Vous pouvez également rendre plus difficile l'exécution des traitements par lots sur le fichier.

+0

Ouais, essayé ... cela fonctionne pour les commandes d'une ligne ... disons que j'ai une fenêtre ui, que je veux ouvrir avec le fichier.(Il peut être enregistré dans le dossier des scripts, mais la commande d'importation ne fonctionne pas avec le script node) Disons que j'ai le code suivant enregistré dans "test.py" dans le répertoire des scripts. – Theprash

+0

'importer maya.cmds comme cmds cmds.window (title =" Nouvelle fenêtre ") cmds.columnLayout (" columnName01 ", adjustableColumn = True) cmds.button (label =" cliquez sur moi ", parent =" columnName01 " , commande = 'cmds.sphere()') cmds.columnLayout ("columnName02", columnAttach = ('both', 5), rowSpacing = 10, columnWidth = 250) cmds.button (label = "Créer une sphère") cmds.showWindow() ' – Theprash

+0

désolé je ne suis pas en mesure de conserver la mise en forme ici ... mais je suis en train d'utiliser exemple de code d'ici - http://www.bojandjulbic.com/code-snippets-creating-gui -using-python-maya/(02.Layout) que faire si je veux créer cette fenêtre dès que le fichier s'ouvre.note: je veux l'enregistrer dans le fichier. au moins une commande d'exécution. Le code ci-dessus peut être stocké dans le répertoire des scripts. – Theprash