[PYTHON] Machen Sie den Mangel an Maya Node-Referenz wieder wett

Guten Morgen allerseits. Es scheint, dass ** Maya Road Book ** bald veröffentlicht wirdAnscheinend (Eingeführt vom Autor) Laut der Lieblings-Maya des Maya-Hackers, Dependency Node (DG) , Directed Acyclic Graph (DAG) wird erläutert. Ich bin glücklich! Bereiten wir uns nun auf den Maya-Knoten vor, indem wir uns auf das offizielle Dokument beziehen (http://help.autodesk.com/cloudhelp/2017/JPN/Maya-Tech-Docs/Nodes/index.html) [^ 3] .. Wenn Sie ein Liebhaber der Einheitenumrechnung sind, werden Sie es bald bemerken. Ja, ich habe nicht über decomposeMatrix / eulerToQuat / quatToEuler geschrieben! Was meinst du! Diese ** Referenz enthält keine vom Plugin abgeleiteten Knoten **! Damit ist es hoffnungslos, dass sowohl der super coole MASH als auch Bifrost von Knoten aus einem Skript gesteuert werden können. Was für ein Durcheinander * (Wenn Sie den Ort der Referenz über den vom Plug-In abgeleiteten Knoten kennen, lassen Sie es mich bitte wissen) * Aber seien Sie nicht traurig! ** Obwohl es nicht offiziell ist, wird es auf http://yamahigashi.github.io/maya-node-list/index.html veröffentlicht **. Dies ist ** Conversion Hodai **. Yay

[^ 3]: Wenn Sie sich vorbereiten möchten, verwenden Sie diese nicht http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=__files_DAG_Hierarchy_htm oder http://help.autodesk.com/view/MAYAUL/2017/ Lesen Sie zuerst JPN /? Guid = __ files_Dependency_graph_plugins_htm


Das Yota-Vorwort wurde verlängert. In diesem Artikel wird erläutert, wie Knoteninformationen über ein Skript abgerufen und in ein Dokument exportiert werden. Durch die Dokumentgenerierung erzählen wir Ihnen eine kleine Geschichte, wenn Sie den gewünschten Prozess ausführen, ohne die Maya-GUI zu starten. Alle zum Generieren des Dokuments verwendeten Skripte finden Sie unter hier. (Bitte beachten Sie jedoch, dass ich viele extrem schlechte Manieren verwende. * Ich dachte, ich würde es nie zweimal sehen. * Bitte bringen Sie nur die Idee mit.)

Überblick

Zuallererst ist der allgemeine Ablauf der Dokumentenerstellung

  1. Exportieren Sie Knoteninformationen aus mayapy.exe mit reStructured Text (rst).
  2. Konvertieren Sie das exportierte erste mit sphinx in HTML.

Es gibt zwei Schritte.

Batch-Start

Sie können den Export auch von der normalen Maya-GUI ausführen, aber hier werden wir versuchen, den Stapel zu starten. Informationen zur Verwendung von mayapy.exe finden Sie in der offiziellen Dokumentation. http://help.autodesk.com/view/MAYAUL/2017/JPN/?guid=GUID-83799297-C629-48A8-BCE4-061D3F275215

Skript ausführen

Feed kann das Skript der ersten Generation über die Befehlszeile "C: \ Programme \ Autodesk \ Maya2017 \ bin \ mayapy.exe dump_maya_nodes.py" analysieren Und so weiter.

Der Zweck des Prozesses ist ** [Liste der Knoteninformationen exportieren] **. Lassen Sie uns nun darüber nachdenken, wie mit einer großen Anzahl von Knoten umgegangen werden soll. Um die Knoteninformationen zu schreiben, müssen Sie zuerst den Knoten identifizieren. Es scheint, dass ID dafür verwendet werden kann. Wie bekommt man den Ausweis? Google? Nein Lassen Sie den Computer das tun, was der Computer kann. Das ist richtig, lassen Sie uns von 0 zählen. [^ 1] Erstellen Sie einen Knoten auf Umwegen. Wenn ein Treffer auftritt, setzen Sie die Verarbeitung fort. Wenn nichts vorhanden ist, wird er so übergeben, wie er ist. [^ 2]

Dies ist sowieso, also lassen Sie es uns parallel laufen. Verwenden Sie das Multiprozessor-Modul.

[^ 1]: Während ich diesen Artikel schrieb, bemerkte ich, dass MPlugin möglicherweise MTypeId abrufen kann. [^ 2]: Abgesehen davon habe ich keine Ahnung, was ich mit MTypeId machen soll. Ich frage mich, was ich als Referenz beim Erstellen meines eigenen Knoten-Plug-Ins verwenden soll, da es ein integriertes Plug-In ist. Eine ID in Autodesk ausgeben? Hmm

dump_maya_nodes.py


# https://github.com/yamahigashi/maya-node-list/blob/gh-pages/tool/dump_maya_nodes.py#L1265-L1294
def dump_id_range_using_multiprocessing():

    import multiprocessing as mp
    import itertools  # python 2.x can not iterate over 'long int' cause overflow error
    range = lambda start, stop: iter(itertools.count(start).next, stop)

    process_count = 4  # mp.cpu_count()
    po = mp.Pool(process_count)
    po.map(initialize_process, xrange(process_count))

    start = 0x30000000
    steps = 0x00001000
    end = 0x90000001
    ceil = 1e4

    while start < end:
        # print('start processing...', start)
        res = po.map_async(dump_node_by_id, range(start, start + steps))

        # wait a moment as the main process eat up huge memory
        # when runnig continuously
        if len(po._cache) > ceil:
            print(".", hex(start))
            res.wait()

        start = start + steps

    po.close()
    po.join()

    print('... done processing')

Es sieht aus wie das.

Ich werde auf Multiprocessing verzichten. Schauen wir uns die Verarbeitungsreihenfolge an. Bereiten Sie zunächst einen Prozess für "process_count" im Pool vor. Initialisieren Sie den vorbereiteten Prozess und laden Sie das Plug-In.

    po.map(initialize_process, xrange(process_count))

Es ist eine Linie von. Die Realität ist

def initialize_process(*args):
    load_plugins()


def load_plugins():

    default_plugins = [
        "ik2Bsolver.mll",
        "objExport.mll",
        "dgProfiler.mll",
        "DirectConnect.mll",
        "quatNodes.mll",
        "matrixNodes.mll",
        "ikSpringSolver.mll",
        "animImportExport.mll",
        ...
    ]

    def _l(name):
        try:
            # print "load plugin load: ", name
            cmds.loadPlugin(name)
        except:
            pass
            # print "pass plugin load: ", name

    for n in default_plugins:
        _l(n)

Es sieht aus wie das. Wenn Sie mit der Mayapy beginnen, wird sie in einem reinen Zustand geboren, sodass sie das lädt, was Sie brauchen. Hier wird nur das Plug-In geladen, aber beschreiben wir es gegebenenfalls je nach Prozess wie dem Laden des Moduls.

Definieren Sie die ID zu Beginn der Verarbeitung, die Anzahl der Schritte und die End-ID, drehen Sie die Schleife und führen Sie die parallele Verarbeitung mit "po.map_async" aus. Wenn Sie eine große Menge wie diesen Zweck verarbeiten möchten, können Sie die Waffe einfach so drehen, wie sie ist. Wenn Sie also gemäß diesem Code "map_async (dump, range (start, end))" außerhalb der while-Schleife ausführen, sterben Sie aufgrund des Speicherdrucks. Daher wird "res.wait ()" eingefügt, nachdem die entsprechenden Schritte aufgeteilt und eine bestimmte Ebene erreicht wurden. Vermeiden Sie unerschöpfliche Maschinenressourcen. Die optimale Anzahl von Stufen und Decken variiert je nach Situation und erfordert einige Versuche und Irrtümer.

Wenn Sie process_count mit dem Kern Ihres Computers abgleichen, können Sie während der Ausführung nichts tun. Daher ist es eine gute Idee, einen gewissen Spielraum zuzulassen. Die Fertigstellung dauert eine Stunde.

Knoteninformationen abrufen

Hier

# https://github.com/yamahigashi/maya-node-list/blob/gh-pages/tool/dump_maya_nodes.py#L43-L91
def dump_node_by_id(raw_id):
        id = om2.MTypeId(raw_id)
        nc = om2.MNodeClass(id)

        typ = om2.MFnDependencyNode()
        obj = typ.create(id, 'test')
        dpn = om2.MFnDependencyNode(obj)

        attributes = {}
        for num in xrange(ac):
            a = om2.MFnAttribute(dpn.attribute(num))
            k, v = inspect_attribute(dpn, a)
            attributes[k] = v

Ich werde einen Knoten als erstellen und seine Attribute untersuchen. Siehe den Code für "inspect_attribute ()".

Export nach rst

Wenn Sie etwas gut formatiertes exportieren möchten, können Sie eine Vorlagen-Engine verwenden. Hier habe ich Jinja2 (Schrein = Tempuru) verwendet. Platzieren wir das Modul daher dort, wo es von Maya Python aus gesehen werden kann. Das Attributsuchergebnis des Knotens wird auf die Vorlage angewendet und generiert. https://raw.githubusercontent.com/yamahigashi/maya-node-list/gh-pages/source/_templates/node.tpl.rst Hier ist die Vorlage.

Shpinx

Sobald Sie so weit sind, müssen Sie nur noch Sphinx ausführen. Führen Sie make html aus.

Hinweis Wenn Sie kein Sphinx-Projekt haben, erstellen und richten Sie ein Sphinx-Projekt ein, bevor Sie das erste erstellen. http://sphinx-users.jp/gettingstarted/make_project.html

abschließend

Was haben Sie gedacht. Es war ein Ansturm, aber ich habe mir die Generierung von Mayas Knotenlistendokument angesehen. Jede Person, die diesen Artikel liest, möchte eine Knotenliste erstellen! Es ist unwahrscheinlich, dass so etwas passieren würde, und wenn es so wäre, würde etwas in der Welt nicht stimmen. Es ist jedoch häufig der Fall, dass Sie Informationen benötigen, die nicht dokumentiert sind, nicht nur Maya. Ich hoffe, dass die hier erläuterte Essenz hilfreich sein wird, wenn Sie auf eine solche Situation stoßen. Es erschien nicht in diesem Artikel, sondern in Python die eingebaute Funktion "help ()" (auch in @ sportys Artikel (http://qiita.com/sporty/items/681aa8bbeac81c71c518)). Mit den Modulen), Dir () und inspect können Sie vorhandenen Code analysieren. In C # kann Reflexion usw. verwendet werden. Die Fähigkeit, Dokumente zu finden, ist ebenfalls sehr wichtig, aber es wird eines Tages hilfreich sein, daran zu denken, dass es einen solchen Weg gibt, wenn dies allein nicht ausreicht.


Recommended Posts

Machen Sie den Mangel an Maya Node-Referenz wieder wett
Einführung in Befehle rund um die Maya-Referenz
Untersuchen Sie die (versteckte?) Option des Maya | -Befehls
Die dritte Nacht der Runde mit für
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Die zweite Nacht der Runde mit für
Machen Sie den Standardwert des Arguments unveränderlich
Die Geschichte, dass die Lernkosten von Python niedrig sind
Ändern Sie das Standardreferenz-Repository für die Pip-Installation
Achten Sie auf den Rückgabewert von __len__
Kopieren Sie die Liste in Python
Bildverarbeitung? Die Geschichte, Python für zu starten
Code zum Überprüfen des Betriebs von Python Matplot lib
Machen Sie den Fortschritt von dd in der Fortschrittsanzeige sichtbar
[Hinweis] Die Geschichte des Einrichtens des SDK für Python von Azure IoT Hub unter Linux
Das Konzept der Referenz in Python brach für einen Moment zusammen, also experimentierte ich ein bisschen.