J'écris une interface graphique et un script qui s'exécutent lorsqu'un objet spécifique est sélectionné dans la scène. Je n'avais aucun problème avant, mais maintenant je suis ...

Quand je sélectionne mon objet, un scriptJob que j'ai créé dit de lancer le programme ... À ce stade, ce n'est pas le cas. En y jetant un œil plus poussé, j'ai essayé de tester le scriptNode, ce qui donne:

// Error:  //
// Error: Line 0.0: invalid directive //

Maintenant, j'ai eu ce problème à l'origine en raison de l'erreur ";" dans mes commentaires. J'ai supprimé tous les points-virgules que je pouvais trouver ... Cela a fonctionné une fois, puis a cessé de fonctionner.

================================================== =======================

Un autre ajout ... J'ai supprimé tous les commentaires de mon script à intégrer, et il appelle maintenant mes classes comme des erreurs de syntaxe. Voir ci-dessous:

// Error: class x2m_info: //
// Error: Line 9.15: Syntax error //

Je devrais également inclure que l'exécution du script normalement FAIT le fait fonctionner normalement. Ceci l'exécute strictement en tant que scriptNode et scriptJob.

============= Voici une tentative de réplication ==============

# Below is a saved py file, its mother file is similar and run in Maya
# Let us say it is saved in this dir, "D:\\USER\\JAMES\\" as "coolscript.py"
import modules # a list of modules, os, sys, subprocess, etc.
class numberOne: # Interpret this as the x2m_info class I specified above
    def about_info(self, x):
        # Does stuff
        if x==1:
            print("Does stuff, like display information: %s" % x)
        else:
            print("Does stuff, like display contact info: %s" % x)
    # Has a few more similar functions

class something:
     def func1(self, x):
         numberOne().about_info(1)
     def func2(self):
         numberOne().about_info(2)
def main():
    something().func1(1)
    something().func1(2)

import maya.cmds as cmds
# Portion in Maya that takes this and embeds it
embedThisFile = "D:\\USER\\JAMES\\coolscript.py"
embeddedStr   = open(embedThisfile, "r")
embed         = embeddedStr.read()
cmds.scriptNode(name="WhereToEmbed", beforeScript=embed, scriptType=1, sourceType="python")

scriptToVar   = cmds.scriptNode("WhereToEmbed", query=1, beforeScript=1)
scriptJobName = cmds.scriptJob(conditionTrue=("SomethingSelected",
                               "if (cmds.ls(selected=1)[0]) == 'pCube1':\
                               exec('%s'); main()" % (scriptToVar)),
                               killWithScene=1, protected=1)
2
SirJames 17 janv. 2017 à 16:58

2 réponses

Meilleure réponse

Votre approche est parfaitement légale dans Maya.

Traduire le code mel en Pymel

La plupart d'entre nous apprennent les commandes Maya en surveillant l'éditeur de script. Il imprime les commandes dans Maya. Il y a un certain ordre lorsque vous traduisez le code mel en python. Voyons d'abord l ' exemple de commande mel pour scriptJob < / a>. Vous pouvez trouver un exemple de code tout en bas de la page. Consultez cet exemple de ligne de code:

//create a job that deletes things when they are seleted
int $jobNum = `scriptJob -ct "SomethingSelected" "delete" -protected`;

-ct flag est le raccourci pour for conditionTrue.

{flag} -ct {space} {first parameter} "SomethingSelected" {space}
              {second parameter-this is the command to execute} "delete". 

Ainsi, lorsque vous traduisez cette commande en pymel, nous devons suivre l'ordre suivant:

cmds.command(flag_1=paramaters,flag_2=paramaters,.......,flag_n=paramaters)

Lorsque vous devez passer plusieurs indicateurs, vous devez les placer dans un tableau, une liste ou un tuple. Ils doivent suivre le bon ordre. En général, le nom de l'objet est le premier paramètre.

cmds.command(flag=[parameter_1,parameter_1,....,parameter_n])

Donc dans votre cas:

scriptJobName = cmds.scriptJob(conditionTrue=["SomethingSelected",
    "if (cmds.ls(selected=1)[0]) == 'pCube1':exec('%s'); main()" 
    % (scriptToVar)], killWithScene=1, protected=1,)

ConditionTrue = [condition, yourScript]

Cependant, si les conditions que vous avez placées sont toutes correctes, cela peut aider à changer la façon dont le code est exécuté à l'intérieur de scriptJob. Principalement:

exec('%s')

Devrait être:

exec('''%s''')

Prise en compte de tous les commentaires, sauts de ligne, retours ou points-virgules dans le code qui est incorporé ... Le triple guillemet agit comme un bloc de commentaire, qui à son tour, permet de traiter l'ensemble du code tel qu'il est réellement.

Dans votre exemple de code, l ' erreur de syntaxe est que Maya ne voit pas de code à exécuter pour la condition. La directive invalide est que Maya ne peut pas traiter le code et raccroche à un moment donné, car elle essaie de traiter la commande comme une directive (terminologie MEL pour un "drapeau").

Tout cela s'explique par l'imbrication incorrecte des citations. Même si ce que vous avez fait était légal et viable, si vous avez des commentaires ("#"), des points-virgules (";"), et des nouvelles lignes et des retours ("\ n", "\ r", respectivement), c'est mieux vaut fournir un commentaire de bloc ... Le guillemet simple / double peut entrer en conflit avec ces informations qui sont déjà dans votre code et diviseront incorrectement votre code.

Cela devrait résoudre votre problème.

Pour plus d'informations sur scriptJobs dans pyMel, regardez ci-dessous:

voir l'exemple de code pymel pour scriptJob

2
SirJames 19 janv. 2017 à 13:25

Vous avez probablement trop compliqué votre situation, vous pouvez simplement injecter un message d'événement et gérer cela. Voici un exemple

runInsideMaya.py

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
import runpy
def testMod(*args, **kwargs):
    getCurrentSel = cmds.ls(sl=True)
    if getCurrentSel:
        if getCurrentSel[0] == "pSphere2":
            fileToInclude = "/tmp/whatIsSelected.py"
            runpy.run_path(fileToInclude, run_name='__main__')

idx = OpenMaya.MEventMessage.addEventCallback("SelectionChanged", testMod)

#when ever you finish doing your stuff
#OpenMaya.MMessage.removeCallback(idx)

whatIsSelected.py

import maya.cmds as cmds

def testFunc():
    getSelection = cmds.ls(sl=True) or []
    if getSelection:
        print "You selected %s" % getSelection[0]

if __name__ == '__main__':
    testFunc()

Ainsi, chaque fois qu'il y a un changement de sélection, cela déclenchera l'événement et si la sélection est pSphere2, il appellera le script externe.

0
Achayan 17 janv. 2017 à 22:07