callSystem
今回のテーマはcallSystem。AE7(?)からAEスクリプトに実装された関数で僕のお気に入りです。どんな関数かというと、Consoleアプリケーション(俗にいうDOSコマンド)を呼び出し、そのコマンドを終了するのを待ち、標準出力に出力された文字列を返り値として戻すものです。 標準出力をフックしているのでDOS窓(Console)は開きませんが、全く同じ感じに使えます。
例えば、下記のスクリプトを実行すると、現在時間を得ることが出来ます。
Consoleアプリでなくても、例えばPhotoshopとかも実行できてしまいます。(まぁ、callSystemを呼び出しだ時点でAfterEffectsはそのプログラムが終了するまで停止してしまいますけど)
以上の説明だけでも、unixとかコマンドラインを使える人なら、すごい魅力を感じるでしょう。まぁ知らない人にははぁ?って感じになると思いますが^^;
GUI全盛のこの時代でも、コマンドライン系のツールは実は信じられないくらい豊富にあるのでAEスクリプトだけでは実装不可能な事が意外と簡単にできたりします。
プロジェクトを収集・ZIPで圧縮、・FastCopyでサーバーへバックアップ等の作業をまとめてボタン1発で可能になります。さらにJavascriptでBatchファイルを動的に作成して、callSystemで実行してしまうなんて荒業も可能だったりします(ファイルのリネームとかこれでやったほうが楽だったりします)
今回は、このcallSystemで使えるConsoleアプリを作成します。とりあえず、僕が今まで作っていたコマンドの紹介してから、Consoleアプリの作り方を説明していきたいと思います。
callSystemsコマンドのインストール・使い方
☆http://bry-ful.ddo.jp/BRY/software/PRGforAE/callSystems.zipallSystems.zip
このアーカイブには、僕が作ったcallSystem用のコマンドとそれを使うサンプルスクリプト・ソース・プロジェクトが入っています。
インストールは、アーカイブ内のto Scripts folderにあるファイル・フォルダをすべてAfterEffectsのScriptsフォルダへコピーしてください。
基本的にコマンド類は環境変数PATHで設定されているフォルダか、それを呼び出すスクリプトと同じフォルダに入れてください。コマンドラインに慣れている方なら、スクリプト上でパス指定して呼び出してしまっても構いません。
大抵の場合、スクリプトと同じフォルダにコマンドを置いておけば大丈夫ですが、ExtendScript Toolkitでスクリプトを作成してる場合、ExtendScript Toolkitは、スクリプトを実行時にカレントディレクトリを移動してしまうので、コマンドの実行に失敗してしまうので注意してください。
CreateShortcut.exeの使い方
CreateShortcut.exeは、指定したファイル・フォルダのショートカットを作成するコマンドです。使用サンプルは、createShortcut.jsxになります。
構文
CreateShortcut.exe <ターゲットのフルパス> [ショートカットの保存先のフォルダのフルパス]
ショートカットの保存先の保存先は省略できます。省略時はデスクトップに作成されます。
作成に成功すると、ショートカットのフルパスが返ります。エラー時は何も返りません。
パスは、”C:\Program Files\…\aaa.jsx”といった形式です。”"で括るのを忘れないように。
DOBON.NETのショートカットを作成するのサンプルをほぼそのまま使用しています。
GetClipboard.exeの使い方
GetClipboard.exeは、クリップボードにあるテキストデータを返すコマンドです。引数は有りません。
IsNotSavedAfterFX.exeの使い方
IsNotSavedAfterFX.exeは、Projectが修正されているが未保存だった場合、文字列trueを返し、保存済みの場合文字列falseを返します。これも引数は有りません。
WindowsAPIでAafterEffectsのプロセスを探し、タイトルバーの文字列の最後が*かどうかで識別を行っています。
MaxSizeAfterFX/MinSizeAfterFX/NormalSizeAfterFXの使い方
MaxSizeAfterFX.exeはAfterEfefctsのメインウィンドウを最大化します。MinSizeAfterFX.exeはAfterEfefctsのメインウィンドウを最小化します。
NormalSizeAfterFX.exeはAfterEfefctsのメインウィンドウの最大化・最小化を解除します。
引数は有りません。
この三つのコマンドは内部でWindosStatusAfterFX.exeを呼び出しているだけです。実際の処理はWindosStatusAfterFX.exeが行っています。
callSystem実行中にはWindowStatusの変更は出来ないので、このような仕様になっています。WindosStatusAfterFX.exeはcallSystemが終了し、アイドリング状態になるのを待った後に最大化最小化の変更を行います。その為スクリプト内で複数回このコマンドを実行しても有効なのは最初の1回のみです。
ProcessStart.exeの使い方
ProcessStart.exeは、指定した他のアプリケーションを起動します。callSystemは、起動したプログラムが終了するのを待ってしまうので作ったものです。
構文
ProcessStart.exe <アプリのフルパス> [アプリの引数1] [アプリの引数2] …
指定するアプリは必ずフルパスで指定してください。アプリの引数は複数指定できます。
パスを指定するときは必ず”"でくくってください。
失敗した場合のみ、”error”の文字列を返します。
SelectFolder.exeの使い方
SelectFolder.exeは、Windows標準のフォルダ戦隊ダイアログを表示して、選択したフォルダのフルパスを返します。スクリプトのダイアログとの違いは、履歴を保存しているので前回選択したフォルダをアクティブにした状態で表示されます。引数は有りません。
SetFolderIcon.exeの使い方
SetFolderIcon.exeは、指定したアイコンをターゲットのフォルダに適応させます。構文
SetFolderIcon.exe <アイコン名> <ターゲットのフォルダのフルパス>
アイコンデータはSetFolderIcon.exeと同じフォルダのiconsフォルダの中に入れてください。
アイコン名を”delete”とするとターゲットフォルダのアイコンを標準アイコンに戻します。
失敗した場合のみ、”error”の文字列を返します。
アーカイブにはサンプルとしてCut_Blue.ico/Cut_Red.ico/fin.icoの三つのアイコンを入れてあります。
このコマンドをAfterEfefcts上でなくても、ショートカットを作成しリンク先にアイコン名を書き加えておけば、ショートカットへのドラッグ&ドロップでもフォルダにアイコンを貼り付けることが出来ます。
SpecialFolder.exeの使い方
SpecialFolder.exeは、指定した特殊フォルダのフルパスを返します。構文
SpecialFolder.exe <特殊フォルダ名>
指定できる特殊フォルダ名は以下のとおりです。
特殊フォルダ名 | 説明 |
---|---|
Desktop | デスクトップ |
MyMusic | マイ ミュージック |
MyPictures | マイ ピクチャ |
System | ウィンドウズシステムフォルダ |
MyDocuments | マイ ドキュメント |
ProgramFiles | プログラムファイル |
ProgramFilesX86 | プログラムファイル(X86) 32BitOSでは無効 |
MyVideos | マイビデオ |
Windows | ウィンドウズフォルダ |
callEditor.exeの使い方
callEditor.exeは、テキストエディタを呼び出すコマンド。Expressionを外部のテキストエディタで編集させるための物。
- callEditor.exe
- callEditor.pref
- callEditor.jsx
callEditor.prefで、使いたいテキストエディタをフルパスで指定。
Expressionが適応されたプロパティを選択し、「外部エディタで編集」ボタンを押せば、テキストエディタが起動されExpressionを編集できる。上書き保存してテキストエディタを終了すれば、Expressionが更新される。
構文
callEditor.exe <Editorに渡すファイルパス>
callEditor.prefで指定されたエディタでファイルを開き、エディタが終了するまで待機します。
エディタが終了しファイルが更新されていたら、ファイルを読み込み標準出力へ。
Consoleアプリの作り方
Consoleアプリは、新しいプロジェクトでコンソールアプリケーションを選べば作成できます。ただ、このままだと基本最低限の参照しか設定されませんので、参照の追加で使うライブラリを追加する必要があります。ただusingを書き加えるだけでは駄目なので注意してください。
また、新しいプロジェクトで、WIndows フォームアプリケーションを選んでProjectを作成した後に、Formを削除しターゲットをConsole用に設定する方法もあります。この方が融通のきくのでC#になれた人ならオススメです。
上のコードのようにProgram.csでFormを作成する部分をコメントアウトして、プロジェクトのプロパティで出力の種類を「コンソールアプリケーション」に設定すれば、Consoleアプリになります。
Main関数の[STAThread]指定は、ダイアログボックス・クリップボード等をを使う時には必ず指定しなければいけません(詳細はDOBON.NET アプリケーション開始時のフォームを非表示にするを参照してください。
関数や変数を定義するときに必ずstaticを宣言しておかないと、エラーになります。
後はコーディングだけですが、やりたい事によってはC#の機能では実装出来ない場合が多々あります。その場合はWindowsAPIをC#から呼び出して実現しなければいけません。まぁ大抵の場合googleで調べればそのものズバリのコードが発見出来ます。今回作ったものもほとんどそうです。
Consoleとのデータのやり取り
Consoleアプリにデータを送る方法は、コマンドラインの引数にする方法がメインとなります。具体的な方法はDOBON.NETの起動時のコマンドライン引数を取得するを参照してください。
逆に受け取る方法は、単純にConsole.writeで出力すれば、それがそのままSystem.callSystem()の返り値になります。
おおきなデータや特殊なデータの場合は、テンポラリのファイルを作成してそれを読み書きすることでやりとりを行うしか今のところ方法が有りません。
終わりに
これでプログラミング入門は終りです。AfterEffectsでスクリプトしか作ったことのない人にC#を紹介しようって目標でやっていたので、結果的に全体的に敷居が高い投稿になってしまいました。また、予定していた「変数」をテーマにしていた記事は長い割に詰まらなかったので自分でボツにしてしまいました(なんせ今回投稿した5件の記事合わせた長さより長いので)
とりあえず、プログラム関係で面白いネタがあったらまた投稿します。
新着記事 : After Effectsユーザーのための、プログラミング入門 その5 callSystem http://bit.ly/eTJ32W
RT @AEUSERS: 新着記事 : After Effectsユーザーのための、プログラミング入門 その5 callSystem http://bit.ly/eTJ32W
AEPProjectのプログラミング入門を投稿しました。これでしばらくお休みです。http://bit.ly/eTJ32W
これやばいな、使い方次第でいろいろできそうな気がする RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その5 callSystem http://bit.ly/fz7gIA
コンソールアプリが動作してる間はAEが停止中というのがポイントか。 RT @AEUSERS: After Effectsユーザーのための、プログラミング入門 その5 callSystem http://bit.ly/fz7gIA
勉強になりやした
「After Effectsユーザーのための、プログラミング入門 その5 callSystem」AEP Project http://t.co/gsStvYt #CS5_jp
「After Effectsユーザーのための、プログラミング入門 その5 callSystem」AEP Project http://t.co/gsStvYt #CS5_jp
スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第5回です。今回のテーマはcallSystemです。http://t.co/gsStvYt
スクリプトは経験があるけれどその他の言語はさわったことがないユーザーを対象に、C#/AEのJavaScriptをメインにプログラム全般を解説する連載の第5回です。今回のテーマはcallSystemです。http://t.co/gsStvYt
今更だけど素晴らしいなーこれ 『After Effectsユーザーのための、プログラミング入門 その5 callSystem』 http://t.co/Tzl5goZH
こんにちわ。
AEスクリプトでクリップボードの内容を取得する方法を調べていて、このページにたどり着きました。
(他の記事も、たびたび参考にさせて頂いてます。)
callSystems.zipがリンク切れになっているのですが
もし差し支えなければ再アップしていただけないでしょうか?
すみません、
他にもリンク切れしているのが多数あってなかなか直せない状態です。
callSystems.zip以下のurlに有りますので直接ダウンロードして下さい。
http://bryful.yuzu.bz/ae/callSystems.zip
わざわざありございます!感謝です!