ファイル・パス
MaxScript チートシート の章一覧
ファイルとパスの操作です。ダイアログでパスを得る、テキストを読み書きする、シーン/外部フォーマットを入出力する の3系統に分けて収録します。
コード中の
c:/...は例です。実際に試すときはgetDir #temp(3ds Max の一時フォルダ)などに置き換えてください。例:p = getDir #temp + "/log.txt"
よく使うパスを取る
getDir #temp -- 一時フォルダ
getDir #export -- 既定のエクスポート先
getDir #scene -- 既定のシーンフォルダ
maxFilePath -- 現在のシーンのフォルダ(未保存なら "")
maxFileName -- 現在のシーンファイル名(未保存なら "")
パスをダイアログで取得する
getOpenFileName caption:"開く" types:"画像(*.jpg)|*.jpg|全て|*.*|"
getSaveFileName caption:"保存先"
getSavePath caption:"フォルダを選択" initialDir:(getDir #scene) -- フォルダだけ選ばせる。initialDir: で最初に開く場所を指定
types:は"説明1|パターン1|説明2|パターン2|...|"の形式で、要素を|で区切り、末尾の|も必要 です。- いずれもキャンセルすると
undefinedを返します。⚠️ 必ず undefined チェック してから使います。具体的には次の形にします。
p = getOpenFileName caption:"開く"
if p != undefined do print p -- キャンセルなら undefined
パス文字列を分解・組み立てる
p = "c:/proj/scene_v003.max"
getFilenamePath p -- "c:/proj/"(フォルダ)
getFilenameFile p -- "scene_v003"(拡張子なしのファイル名)
getFilenameType p -- ".max"(拡張子)
pathConfig.appendPath "c:/proj" "tex.png" -- パス結合(+ で結合すると / の有無で二重になったり欠けたりするので区切りを任せる)
- ⚠️ パスの区切りは
/でも\でも構いませんが、\を文字列に書くときは"c:\\proj"のように重ねるか、@"c:\proj"の形にします("c:\tex"は\tがタブになる)。
フォルダ・ファイルの存在確認と一覧
doesFileExist "c:/a.max" -- ファイル/フォルダの有無
makeDir "c:/out" all:true -- フォルダ作成(親ごと)
getFiles "c:/tex/*.jpg" -- 条件に合うファイル一覧(フルパスの配列)
getFiles "c:/tex/*.jpg" recurse:true -- サブフォルダも含める
getDirectories "c:/proj/*" -- サブフォルダ一覧
deleteFile "c:/tmp.txt" -- ファイル削除
テキストファイルを書く / 読む
-- 書き込み(日本語を含む場合は encoding:#utf8 を付けると他ツールでも読めます)
f = openFile "c:/log.txt" mode:"w" encoding:#utf8
format "処理開始: %\n" (localTime) to:f -- % の位置に localTime(現在日時の文字列)が入る。\n は改行
close f
-- 1行ずつ読む
f = openFile "c:/log.txt" -- mode: 省略 = 読み込み専用
while not (eof f) do print (readLine f)
close f
- ⚠️
openFileの後は 必ずcloseします。閉じ忘れるとファイルがロックされたままになります。 - ⚠️
openFileは開けないとundefinedを返します。f = openFile ...のあとはif f != undefined do (...; close f)の形にします。
シーンファイルの入出力
loadMaxFile "c:/scene.max" -- 開く
saveMaxFile "c:/scene.max" -- 保存
mergeMaxFile "c:/lib.max" #autoRenameDups -- 別シーンを現在のシーンに統合(同名ノードは自動リネーム)
resetMaxFile #noPrompt -- 新規シーン(確認なし)
holdMaxFile() -- 一時保存
fetchMaxFile() -- 一時保存を呼び出し(確認あり。quiet:true で抑止)
- ⚠️
loadMaxFile/saveMaxFileは 確認なしに現在のシーンを置き換え・上書き します。ユーザの作業中シーンで使う前にif checkForSave() do loadMaxFile ...(変更があれば保存を尋ね、キャンセルなら false)を挟みます。quiet:trueを付けると不足プラグインなどの警告も抑止できます。 mergeMaxFileは同名ノードの扱いを#autoRenameDups(自動リネーム)/#skipDups(取り込まない)/#deleteOldDups(既存を削除して置き換え)のように#名前を並べて指定します。取り込んだノードはgetLastMergedNodes()で得られます。fetchMaxFile()は確認ダイアログが出ます。バッチ用途ではfetchMaxFile quiet:trueを使います。
外部フォーマット(FBX / OBJ など)
importFile "c:/a.fbx" #noPrompt -- 設定ダイアログを出さずにインポート
select $Box001 -- selectedOnly:true を使う前に選択しておく
exportFile "c:/out.fbx" #noPrompt selectedOnly:true -- 選択のみエクスポート
#noPromptで 設定ダイアログを出さず に処理します。バッチ処理の定番です。- FBX の細かい設定は
FBXExporterSetParam/FBXImporterSetParamで行います。⚠️ FBX プラグインがメモリにロードされていないとエラーになるため、先にpluginManager.loadClass FBXEXPを実行しておきます。ユーザの設定を汚したくないときはFBXExporterSetParam "PushSettings"/"PopSettings"で退避・復帰します。
シーン内の一部だけ保存・中身を調べる
saveNodes $Box001 "c:/box.max" -- 選択したノードだけを別ファイルに保存
getMAXFileObjectNames "c:/scene.max" -- 開かずにファイル内のオブジェクト名を調べる
落とし穴まとめ
- パス取得系はキャンセルで
undefined。必ずチェックする。 openFileはcloseとセット。閉じ忘れに注意。openFileは失敗するとundefinedを返すので、その場合はcloseしない。- バッチ処理では
#noPromptでダイアログを抑止する。 mergeMaxFileは同名ノードの扱いを#autoRenameDups/#skipDups/#deleteOldDupsなどのフラグで制御する。loadMaxFile/saveMaxFileは確認なしに現在のシーンを置き換え・上書きする。- パスの
\を文字列に書くときは\\と重ねるか@"..."にする。
関連
- ファイル名から連番を作る・整形する: 「文字列・配列」章
- レンダリング結果の出力先指定: 「シーン・レンダリング」章
コメント