Archives pour la categorie ‘Script’

[Python/Maya] Reload modules

Dans Maya (ou tout autre soft disposant d’une console) quand on utilise les packages, on est amené à les recharger pour prendre en compte les modifications, et c’est chiant!
Pour un package du style:

Root
`- __init__.py
`- main.py
`- ui.py

Il faut executer:

import Root
import Root.main
import Root.ui
reload(Root)
reload(Root.main)
reload(Root.ui)

Vous trouverez multiple sites vous expliquant comment python gère ses modules, je n’aborderais donc pas ça ici.
Excellent article sur ce site:

Avec le bout de code suivant, vous supprimez les modules

def rld(*args):
    """Delete modules with given name inside their sid (key in
     sys.modules)
    Ex:
    rld("Ti", "Foo")
    Will clear entry from all modules containing Ti and Foo in thair name.
    """
    for x in sorted(sys.modules):
        if any([True for t in args if t in x]):
            del sys.modules[x]

Vous n’aurez qu’a les re-importer pour les utiliser, modifications comprises.
Il existe sans doute autant d’autres méthodes que de devs, mais en 4 ans d’utilisation intensive, il ne m’a jamais fait défaut.

Maya: executer un fichier python en le glissant dans le viewport

Si vous êtes un du genre à vouloir utiliser des modules python comme des fichiers MEL, à vouloir juste drag and drop un .py dans le viewport maya pour le charger (oui, j’ai souvent eu droit à des « Eh mais python c’est de la *****, c’est pas reconnu par maya sauf si c’est dans le script editor, c’est ******! »), utiliser des petits scripts sans dépendances, tous regroupés dans un fichier, si vous avez peur de vouloir gérer des modules/packages et que vous ne voulez pas vous prendre la tête avec les « import », cet article est fait pour vous!

Enregistrez le code ci-dessous dans un fichier « .py », dans le plugin manager de maya (Window->Settings/Preferences->Plug-in manager), allez chercher le plugin précédemment créé (où placez le dans un des répertoire de plugins que maya va lancer au démarrage) et le tour est joué!
Vous pouvez maintenant drag&drop des fichiers .py (attention, pas .pyc) dans maya!

# -*- coding: utf-8 -*-

import sys
import maya.OpenMayaMPx as mpx


class PyDrop(mpx.MPxFileTranslator):
    registeredName = "pyDrop"

    def __init__(self):
        mpx.MPxFileTranslator.__init__(self)

    @classmethod
    def canBeOpened(cls):
        return False

    @classmethod
    def haveReadMethod(cls):
        return True

    @classmethod
    def filter(cls):
        return "*.py"

    @classmethod
    def defaultExtension(cls):
        return "py"

    def reader(self, file_, optionsString, mode):
        execfile(file_.rawFullName())


def translatorCreator():
    return mpx.asMPxPtr(PyDrop())


def initializePlugin(mobject):
    mplugin = mpx.MFnPlugin(mobject)
    try:
        mplugin.registerFileTranslator(PyDrop.registeredName, None, translatorCreator)
    except:
        sys.stderr.write("Failed to register translator: %s" % PyDrop.registeredName)
        raise


def uninitializePlugin(mobject):
    mplugin = mpx.MFnPlugin(mobject)
    try:
        mplugin.deregisterFileTranslator(PyDrop.registeredName)
    except:
        sys.stderr.write("Failed to deregister translator: %s" % PyDrop.registeredName)
        raise

Maya convertir des images en normal map

from maya.OpenMaya import MImage
import os.path as osp


def convertBumpToNormal(src, dst, scale=1, outputFormat=None, force=False):
    """Creates a new file (dst) that can be used as normal map file from given (src)
     file.

    :param src: Source file used to create normal map.
    :type src: str
    :param dst: Destination file, where to save converted map.
    :type dst: str
    :param scale: Depth normal scale, can vary from -256.0 to 256.0, although typical values range from 1.0 to 10.0.
    :type scale: float
    :param outputFormat: Destination format, if not set, if taken from given dst or src.
    :type outputFormat: str
    :param force: If dst file exists, overwrites it.
    :type force: bool
    """
    image = MImage()
    if not osp.isfile(src):
        raise ValueError("%s if not a file!" % src)
    if osp.isfile(dst) and not force:
        raise Exception("%s already exists, use -force flag to overwrite." % dst)

    image.readFromFile(src)
    image.filter(MImage.kHeightFieldBumpFormat, MImage.kNormalMapBumpFormat, scale)

    outputFormat = (outputFormat or osp.splitext(dst)[1].replace(".", "") or
                    osp.splitext(src)[1].replace(".", ""))
    if not outputFormat:
        image.writeToFile(dst)
    else:
        image.writeToFile(dst, outputFormat)

Script

Bonjour à tous!

« Scripter, ça sert à quoi? »,  voilà la question qu’on me pose souvent.

Mais généralement si la personne est intéressée mais n’a aucune idée de l’utilité, je lui donne une chaîne de 1000 joints et je lui demande de mettre un contrôleur FK à chaque joint (donc créer le contrôleur, le grouper, le renommer avec le nom du joint avec la nomenclature en vigueur (joint_ctrl, joint_ctrlGrp,…), lui donner l’orientation du joint pour créer une contrainte parent propre (elle même renommée), et enfin de reparenter chaque contrôleur les uns aux autres pour qu’ils suivent la chaîne, bref, généralement au bout de 3 controlleurs, ils arrêtent. Lire Plus

Haut de Page