リファレンス / 3ds Max / MaxScript チートシート

ファイル・パス

  • 3dsMax
  • MaxScript
  • チートシート
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 は確認なしに現在のシーンを置き換え・上書きする。
  • パスの \ を文字列に書くときは \\ と重ねるか @"..." にする。

関連

← MaxScript チートシート へ