こんにちは!Rhinoです。
シーンを開いた後で「しまった!プロジェクトをセットしていなかった!!」という
経験ないでしょうか?僕は慌ててる時などよくあったりします。
そこで、それを解決するような方法の1つを考えてみました。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
import os
def checkProject( root, currentScenePath ):
result = False
if "scenes" in os.listdir( root ) and "workspace.mel" in os.listdir( root ):
sceneFile = os.path.basename( currentScenePath )
if sceneFile in os.listdir( os.path.dirname( currentScenePath ) ):
result = True
return result
currentScenePath = cmds.file( q=True, sn=True )
if( len( currentScenePath ) != 0 ):
root = os.path.dirname( os.path.dirname( currentScenePath ) )
if checkProject( root, currentScenePath ):
cmds.workspace( root, o=True )
解説
今回考えてみたのはこんな流れになっています。
- 今開いているシーンファイルのパスを取得
- シーンファイルがあるフォルダの上層のフォルダを取得
- そのフォルダがMayaのプロジェクトフォルダなのかどうかをチェック
- フォルダをプロジェクトフォルダにセットする
では行きましょう!
まずは3行目。
ここでは以降でフォルダやパスにアクセスする機能を使う為に必用なosモジュールを読み込んでいます。
import os
def以下は関数の定義になります。後で解説しますね。
少し下に飛んで13行目から、このScriptは始まっています。
まずは今開いているファイルのパスを取得します。
currentScenePath = cmds.file( q=True, sn=True )
ここで疑問が浮かびました。
もし開いているファイルがまだ保存されていなかったとしたらどうなるでしょうか?
答えは変数currentScenePathには何のパス(文字列)も入っていないです。
このような状況を避ける為に、パス(文字列)を数えて0(ゼロ)でなければ、何らかの
パスが入っていることとしてプログラムを動かすように分岐させました。
if( len( currentScenePath ) != 0 ):
Mayaのプロジェクトフォルダは大体このような構成になっていると思います。
ドキュメントアンドセッティングの中のデフォルトのプロジェクトフォルダの構成ですが、
色々なフォルダがありますね。場合によっては不要なフォルダを消していらっしゃるかも
しれません。
今開いているファイルはおそらくscenesフォルダの中にはいっているはずです。
その為、開いているファイルの上層のフォルダであるdefaultがプロジェクトフォルダで
あればセットしてしまえばいいですよね。
まずは ファイルの上層のフォルダ 、具体的には開いているファイルの2つ上の階層のフォルダを取得します。
上の画像のdefaultフォルダのことです。
フォルダ名を取得するにはos.path.dirnameを使います。osがでてきましたね。
2つ上が欲しいので、os.path.dirnameを2回使っています。
root = os.path.dirname( os.path.dirname( currentScenePath ) )
取得したフォルダがMayaのプロジェクトフォルダの条件に合うかどうかをチェックします。
その為にcheckProjectという新しい関数を作りました。
if checkProject( root, currentScenePath ):
checkProject関数の中には上のdef以降で定義されています。
では、どうやってMayaのプロジェクトかどうかを見分ければいいのでしょうか?
赤枠で囲ったフォルダとファイルに注目してみます。
こんな風に考えられないでしょうか?
- プロジェックトの中にはscenesフォルダがある
- プロジェクトの情報が書かれているworkspace.melがある
- シーンファイルはscenesフォルダの中にある
この3つの条件を満たすものがプロジェクトフォルダだと定義しました。
それを記述しているのがdef以降になります。defを使って新しい関数を作成することが
できます。
def checkProject( root, currentScenePath ):
result = False
if "scenes" in os.listdir( root ) and "workspace.mel" in os.listdir( root ):
sceneFile = os.path.basename( currentScenePath )
if sceneFile in os.listdir( os.path.dirname( currentScenePath ) ):
result = True
return result
最後にこれらの条件を満たしていれば、プロジェクトとしてセットします。
cmds.workspace( root, o=True )
上手くセットできましたでしょうか?
シンプルな条件でMayaのプロジェクトフォルダかどうかを判定していますが、
実際の業務により条件は異なるかもしれません。
ぜひ色々と試してみて下さいね。
では、また!
コメント