« artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-02 | トップページ | artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?回答が出た… »

artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-03

ところで、C4Dはウィルス対策のためにC.O.F.F.E.E.エクスプレッションタグ内からのファイル操作を出来ないようにしています。

と、言う事はXPressoからのファイル操作は出来ないのだろうか?

まずは、C.O.F.F.E.E.エクスプレッッションから試してみます。

Export_05

/*
C.O.F.F.E.E.エクスプレッションタグ内からのファイル操作テスト
2009.7.12
*/


main(doc , op)
{
  var file = new(BaseFile);
  var path = new(Filename);
  println("BaseFileクラス : " , file);
  println("Filenameクラス : " , path);
}

C.O.F.F.E.E.でファイル操作をするには、BaseFileクラスとFilenameクラスを使うのですが…
C.O.F.F.E.E.エクスプレッション内で、この2つのクラスの割り当てをしようとしても、不可能です。

BaseFileクラス : nil
Filenameクラス : nil

特に、BaseFileクラスを割り当てられないと、ディスク上のファイル自体にアクセスできません。

では、XPressoのC.O.F.F.E.E.ノードではどうでしょう…
XPressoにはサウンドノードがあり、音声ファイルが扱えます。
C.O.F.F.E.E.ノードの入力ポートの型に「ファイル名」があるので、ファイル操作が出来る可能性があります。

Export_06

C.O.F.F.E.E.ノードの入出力ポートは、いりません。

Export_07

/*
C.O.F.F.E.E.XPresso内からのファイル操作テスト
2009.7.12
*/


main()
{
  var file = new(BaseFile);
  var path = new(Filename);
  println("BaseFileクラス : " , file);
  println("Filenameクラス : " , path);
}

結果は…

BaseFileクラス : [object-22633E50]
Filenameクラス : [object-22633E7C]

BaseFileクラスもFilenameクラスも割り当てに成功しています。

ただし、問題があります。
ファイルを指定するには?ファイル保存ダイアログを開くわけだが…
XPressoはイベントがあるたび実行されます。
アニメーションのフレームの移動以外にも、オブジェクトが選択されただけでも実行されます。

ここからは、注意が必要です。
何度か、失敗してC4Dが応答なしになりました。

その事を覚悟の上で、実行される方は実行してください。
大切なファイルは、閉じてください。
最悪な状態になっても、自分で修復してください。

さて、先ほどのC.O.F.F.E.E.ノードを次のように変更します。

/*
C.O.F.F.E.E.XPresso内からのファイル操作テスト
2009.7.12
*/


var path;  //ファイルを開くためのファイルパスの格納用(グローバル変数)

main()
{
  var doc = GetActiveDocument();  //現在のドキュメントを取得
  var fm = doc->GetTime()->GetFrame(doc->GetFps());  //現在のアニメーションフレームの取得

  var file = new(BaseFile);       //ファイル操作の為のBaseFile

  if(!path){  //このコードが初めて実行された時だけ保存ダイアログを開く
    path = new(Filename);
    path->FileSelect("保存" , TRUE);
  }

  var path2 = path->GetClone();       //保存作業用ファイルパスを複製取得
  path2->DelSuffix();                 //ファイルパスから万が一の拡張子の削除
  var name = path2->GetLastString();  //ファイルパスからファイル名の取得
  path2->RemoveLast();                //ファイルパスからファイル名の削除
  path2->AddLast(name + tostring(fm));//ファイルパスにファイル名+フレーム数を追加
  path2->SetSuffix("txt");            //ファイルパスに拡張子.txtを追加

  file->Open(path2, GE_WRITE);        //ファイルを書き込み用として作業用パスで開く
  file->WriteString("frame : " + tostring(int(fm))); //ファイルにフレーム数を記録
  file->Close();                      //ファイルを閉じる
}

実行すると、保存ダイアログが開きますので、ファイル名を入力します。

Export_09_2

キャンセルボタンを押さないように…
キャンセル処理はしていません。

保存ダイアログに入力後は、アニメーションを再生するか、タイムスライダーを移動させてください。

Export_08

すると、保存ファイルを指定したフォルダに、テキストファイルが作られます。

Export_10_3

これで、保存されたテキストファイルを開くと、

Export_11

テキストで、フレーム数が記録されています。

少しは、希望の光が見えてきたような…

でもね、このXPressoを含んだシーンファイルを保存して、もう一度開くと保存ダイアログが出た状態で、C4Dが応答なしになります
自分だけだろうか?

XPressoでファイルを扱うのが無理があるのだろうか?

ファイルを吐き出す為に、アニメーションを再生させるのはどうかと思うのだけど…
ユーザスクリプトの方が、良いと思うんだけどね。

|

« artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-02 | トップページ | artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?回答が出た… »