7

Windows のコマンド プロンプト (または Linux の bash) からスクリプトを呼び出して Maya を開き、続いて Maya 内でカスタム スクリプトを実行することはできますか (実行するたびに変更される可能性があります)。userSetup ファイルを変更してから Maya を実行するよりも、もう少し洗練されたものを探しています。

ここでの目標は、.mb ファイルを開き、スクリプトを実行してシーンを内部に配置し、一般的なライト セットをセットアップして、シーンを特定の場所とファイル タイプにレンダリングできるようにすることです。これをスケジュールされたタスクとして設定して、ディレクトリ内の新しいシーン ファイルをチェックし、Maya を開いて実行できるようにしたいと考えています。

助けてくれてありがとう!

4

2 に答える 2

13

このような場合、本格的な UI モードの代わりに Maya スタンドアロンを使用できます。より高速です。このようなバッチ スケジュール ジョブに最適です。Maya スタンドアロンは、GUI なしで Maya を実行するだけです。Maya スタンドアロンを初期化したら、元の呼び出しスクリプトの一部として、必要なスクリプトをインポートして呼び出すことができます。ここから始めるには、例を示します: (これを参照として自由に使用し、ニーズに合わせて変更してください)

スクリプトでは、最初に Maya スタンドアロンを初期化します。

import maya.standalone
maya.standalone.initialize("Python")

import maya.cmds as cmds
cmds.loadPlugin("Mayatomr") # Load all plugins you might need

これで Maya が実行されます。ここで、必要なすべてのファイル (ライト、モデルなど) を開くかインポートします。

# full path to your Maya file to OPEN
maya_file_to_open = r"C:/Where/Ever/Your/Maya_Scene_Files/Are/your_main_maya_file.mb"

# Open your file
opened_file = cmds.file(maya_file_to_open, o=True)

# full path to your Maya file to IMPORT
maya_file_to_import = r"C:/Where/Ever/Your/Maya_Scene_Files/Are/your_maya_file.mb"

# Have a namespace if you want (recommended)
namespace = "SomeNamespaceThatIsNotAnnoying" 

# Import the file. the variable "nodes" will hold the names of all nodes imported, just in case.
nodes = cmds.file(maya_file_to_import, i=True,
                          renameAll=True,
                          mergeNamespacesOnClash=False,
                          namespace=namespace,
                          returnNewNodes=True,
                          options="v=0;",
                          type="mayaBinary" # any file type you want. this is just an example.
                          )

#TODO: Do all your scene setup/ positioning etc. if needed here...
#Tip: you can use cmds.viewFit(cam_name, fitFactor=1) to fit your camera on to selected objects

このファイルを保存し、Maya バッチ レンダラーを呼び出してレンダリングします。

render_file = "C:/Where/Ever/Your/Maya_Scene_Files/Are/your_RENDER_file.mb"
cmds.file(rename=render_file)
cmds.file(force=True, save=True, options='v=1;p=17', type='mayaBinary')

import sys
from os import path
from subprocess import Popen

render_project = r"C:/Where/Ever/YourRenderProjectFolder"
renderer_folder = path.split(sys.executable)[0]
renderer_exec_name = "Render"
params = [renderer_exec_name]
params += ['-percentRes', '75']
params += ['-alpha', '0']
params += ['-proj', render_project]
params += ['-r', 'mr']
params += [render_file]
p = Popen(params, cwd=renderer_folder)
stdout, stderr = p.communicate()

それでおしまい!もちろん、スクリプトは Maya の Python インタープリタ (Mayapy) を使用して実行する必要があります。

その他のオプションに使用されるすべてのコマンドについては、ドキュメントを確認してください。特に: cmds.file() cmds.viewFit() cmds.loadPlugin() Subprocess および Popen

さらに、Python の優れた機能により、sched( docs ) のようなモジュールを使用して、Python コードでこのメソッドの実行をスケジュールできます。

これが役に立ったことを願っています。これを楽しんでください。乾杯。

于 2014-12-12T12:55:11.713 に答える
4

多くは、あなたが何をする必要があるかによって異なります。

Maya 機能にアクセスできるスクリプトを実行する場合は、Kartik の回答のように Maya スタンドアロン インスタンスを実行できます。Maya と同じフォルダにインストールされているmayapyバイナリは Maya Python インタープリタです。Mayapy を実行するのと同じ方法で直接実行できますpython.exe 。Mayapy には、通常の Python インタープリタと同じコマンド フラグがあります。

mayapy セッション内で呼び出すとstandalone.initialize()、Maya セッションが実行されます。いくつかの例外を除いて、通常の Maya セッションのスクリプト タブ内で実行されているかのようです。

起動時に Maya に特定のスクリプトを強制的に実行させるに-cは、python の場合と同様にフラグを呼び出すことができます。たとえば、maya を起動して、空のシーンの内容を次のように出力mayapy.exeできます (注: はパス上にあると想定しています。maya の bin ディレクトリに CD を実行することもできます)。

mayapy -c 'import maya.standalone; maya.standalone.initialize(); import maya.cmds as cmds; print cmds.ls()'
>>> [u'time1', u'sequenceManager1', u'renderPartition', u'renderGlobalsList1', u'defaultLightList1', u'defaultShaderList1', u'postProcessList1', u'defaultRenderUtilityList1', u'defaultRenderingList1', u'lightList1', u'defaultTextureList1', u'lambert1', u'particleCloud1', u'initialShadingGroup', u'initialParticleSE', u'initialMaterialInfo', u'shaderGlow1', u'dof1', u'defaultRenderGlobals', u'defaultRenderQuality', u'defaultResolution', u'defaultLightSet', u'defaultObjectSet', u'defaultViewColorManager', u'hardwareRenderGlobals', u'hardwareRenderingGlobals', u'characterPartition', u'defaultHardwareRenderGlobals', u'lightLinker1', u'persp', u'perspShape', u'top', u'topShape', u'front', u'frontShape', u'side', u'sideShape', u'hyperGraphInfo', u'hyperGraphLayout', u'globalCacheControl', u'brush1', u'strokeGlobals', u'ikSystem', u'layerManager', u'defaultLayer', u'renderLayerManager', u'defaultRenderLayer']

-i フラグを使用して、mayapy をインタラクティブに実行することができます。これは、実質的に Maya のコマンド ライン バージョンです。これにより、mayapy が起動し、コマンド プロンプトが表示されます。

mayapy -i -c \"import maya.standalone; maya.standalone.initialize()\""

これにより、スタンドアロンが再び開始されますが、コマンドを実行して終了する代わりにセッションが続行されます。

スクリプト ファイルを実行するには、ファイルを引数として渡すだけです。standalone.initalize()その場合、Kartik が提案するように実行し、スクリプトに含めたいと思います。次に、それを呼び出します

mayapy path/to/script.py

userSetup を抑制するには、と呼ばれる環境変数を作成し、 MAYA_SKIP_USERSETUP_PYそれをゼロ以外の値に設定します。これにより、usersetup を実行せずに Maya がロードされます。mayap を実行する前に、環境変数またはパス変数を変更することもできます。たとえば、次の 2 つの bash エイリアスを使用して、2 つの異なる環境から mayapys を実行できます (Windows では、EXPORT の代わりに SET を使用して環境変数を変更します)。

alias mp_zip="export MAYA_DEV=;mayapy -i -c \"import maya.standalone;    maya.standalone.initialize()\""
alias mp_std="export MAYA_DEV=C:/UL/tools/python/ulmaya;export ZOMBUILD='C:/ul/tools/python/dist/ulmaya.zip';mayapy -i -c \"import maya.standalone; maya.standalone.initialize()\""

このブログ投稿には、必要に応じてさまざまな環境で Mayapy インスタンスを起動するための Python モジュールが含まれています。

別の環境から実行中の Maya と対話したい場合、たとえば、ハンドヘルド デバイスまたは C プログラムからリモート コントロールしようとしている場合、Maya commandPortを使用して、TCP 経由で単純な要求を処理できます。より複雑な状況では、このような独自の基本的なリモーティング サービスをセットアップするか、 RPyCZeroMQなどの既存の python RPC モジュールを使用できます。

于 2014-12-12T18:49:48.003 に答える