Guten Morgen allerseits. Es scheint, dass ** Maya Road Book ** bald veröffentlicht wird (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.)
Zuallererst ist der allgemeine Ablauf der Dokumentenerstellung
Es gibt zwei Schritte.
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
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.
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 ()".
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
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