クイックアクションをもっと。

クイックアクションから直にPhotoshopやAfter Effectsは操作できなくても、AppleScript経由で全てのスクリプト制御を使用可能です。

 

Adobeのスクリプト機能をAppleScriptでラップして、Automatorのクイックアクションで実行できるのです。

 

ややこしいですが、PhotoshopやAfter Effectsの豊富なスクリプト機能がまずあって……

 

 

それをAppleScriptの「DoScript」で実行可能にして‥‥

 

 

ユーザにはAutomatorのクイックアクションとして供給する‥‥

 

 

という流れです。

 

Automatorの「AppleScriptを実行」は、外部ファイルも呼び出せるので、jsxのスクリプトファイルも読み込み可能です。もちろん、直にJavaScriptの文をAppleScriptの中に書いて実行することも可能です。

 

では、お約束の。

 

 

 

AppleScriptのdisplay dialogではなく、JavaScriptのalert()にてダイアログを表示しました。つまり、AdobeのJavaScript自動処理で動作しているということです。

 

ハローワールドではちっともAfter Effectsぽくないので、After Effectsに「PSDはコンポで、そのほかの画像ファイルはフッテージで」というちょっとしたスマートインポートを実行してみます。

 

 

After Effectsのドラッグ&ドロップでは、一緒にファイルをドロップすると、全部同じ読み込み形式になったりします。スクリプトを使えば、PSDはレイヤーを保持したコンポジションで読み込んで、TIFFやTGAはフッテージ(アルファがある場合はアルファ付き)で読み込んで‥‥と、単純な動作ではありますが、ちゃんとファイルを切り分けて読み込みします。

 

内容はこんな感じ。とても単純なIF分岐。

 

 

マウス右クリックで実行してみます。

 

 

はい、完了。

 

種別を見ての通り、PSD(=コンポで読み込み可能なファイル)はコンポジションで、TIFFやTGAはレイヤー構造をもたないフッテージで読み込みました。

 

*背景は空と山BOOKと地面BOOKのPSD、雲はTIFF、星はTGAです。

 

これを発展させれば、以前私が作っていたコンポ自動ビルドツールと同じ自動処理も可能です。背景とセルを読み込んでコンポに配置してタイムシートも適用する‥‥という流れを自動化できます。

 

今ごろ、Automatorに注目しているあたり、ちょっと間抜けなんですが、まあ、いいです。便利なものに時と場所は関係なし。

 

アニメ業界でも、映像業界でも、Macを使っている人は結構多いですよネ。仕事では業務用Windowsでも、プライベートではMacBookやiPadを使っている人を数多く見ます。

 

クイックアクションは右クリックで呼び出せて、いちいちマウスを大きく移動させる手間がないので、地味に快適になりますヨ。

 

 


コンポーネント

たとえ小さなスクリプトを作成する際にも、同じサブルーチンを何度も繰り返し書くのは非効率である上に、メンテナンスも煩雑になります。

 

例えば再帰処理を毎回書くのはいかにも面倒ですよネ。なので、共通したルーチンは、コンポーネント化して集約します。

 

AppleScriptは他の言語同様、外部のスクリプトを読み込んで活用できます。以下みたいに。

 

set myCOMP to load script file "Macintosh:components.scpt"

display dialog myCOMP's getFileList(folder "Macintosh:Folder:")

 

とは言うものの、最近のmacOSは、昔のようにユーザが自由にイジれる仕様ではなくなっています。以前は可視だったシステム関連のフォルダは不可視になって久しいです。

 

たとえば、クイックアクションで使うルーチンのコンポーネントをどこに置いておけば良いか。

 

簡単な方法としては、クイックアクションのファイルと同階層に置くのがいかにもわかりやすいです。

 

しかし、果たしてクイックアクションのファイルから見て「同階層」とはどこになるのか。クイックアクションに内包されるAppleScriptから呼び出すので、「ユーザ/Library/Services/」を示す結果となるのか。

 

 

‥‥‥‥。どこ?

 

おそらく、Automatorのパッケージファイルの中の深いところでしょう。

 

そりゃそうか。クイックアクションのファイルはそれ自体は実行ファイルじゃないもんな。「path to me」すれば、実行ファイル自身のパスを取得するのは当然か。

 

runner.xpcという実行ファイルに頼っているようですネ。でもまさか、Automatorのフレームワークの中に私独自のファイルを置くわけにはいくまい。アップデートのたびに消される可能性大。

 

う〜ん、どうしようか。

 

 

 

コンポーネントをどこかにおいて呼び出すことは簡単ですが、どうせなら、Application Supportとかに置いて、クイックアクションだけでなくスクリプトメニューやレンダー庭園(仮名)とも共用したいです。

 

しかし、従来のApplication Supportだと、マシンローカルに限定されます。Catalina以降は色々と実行許可もキビしいし。

 

むしろ、Apple IDを活用して、iCloudの特定場所にしたほうが良いかな。

 

そうすれば、同一のApple IDを使う限り、どのマシンでもコンポーネントが呼び出せます。

 

 

 

では、iCloudって、どんなパスになるんでしょう。

 

/Users/ローカルのアカウント/Library/Mobile Documents/com~apple~CloudDocs/

 

「com~apple~CloudDocs」というのが、見慣れないですが、Finderが認識できるiCloudのパスはソコみたいですネ。

 

なので、「home」(AppleScriptでのユーザホームフォルダのエイリアス)でユーザのローカルパスを取得して、「Library/Mobile Documents/com~apple~CloudDocs/」を連結し、あとはコンポーネントファイルの以下のパスを連結すれば、毎回変わらず特定できそうです。

 

/Users/ローカルのアカウント/Library/Mobile Documents/com~apple~CloudDocs/コンポーネントのパス

 

これでiMacからもMacBookからもMac miniからも、コンポーネントが呼び出せて、コンポーネントを編集して機能アップすれば、全台のMac端末に反映されます。

 

試しにTIFFの変換スクリプトを移植がてら、正常に動作するか試してみました。

 

 

 

無事、TIFFファイルが書き出されました。

 

 

 

随分と自由なファイル名ですが、クォーティング(quated form)してShellに投げるので、正常に処理されます。もちろん、仕事の時は、こんな名前は一切出しませんし、仕事用のリネームスクリプトも色々用意しています。それこそ、CODE39の文字に丸めるスクリプトとかネ。

 

*「安全な文字列に変更」というスクリプトも随分前に作りました。

 

 

クイックアクションはいっそのこと、Library/Servicesもクラウドで共有できると楽なんですが、まずはそこまでしなくても良いか。

 

今頃になって、Automatorを使い始めるのも何ですが、右クリックで素早くJPEGやTIFF、連番リネーム、項目のリストなどが取得できると、作業が地道に捗ってストレスが軽減されます。

 

「こんな感じの絵です」みたいな途中経過の画像をメールで送る時に、まさかPhotoshopを立ち上げてJPEGに変換するなんて大げさな手間はしたくないですよネ。右クリックでJPEG変換できれば楽です。

 

クイックアクセス用途だけでも、まずはAutomator重宝。

 

 

 


クイックアクション

‥‥といっても、QARのことではなく、macOSのFinderの右クリックメニューの「クイックアクション」です。

 

前々から、ここに自分で作った数々のプチスクリプトを呼び出せるようにすれば便利だなと思っていました。ファイル名を大量に置換したり、ファイル名を番号でリネームしたり、JPEGやTIFFに変換したり‥‥と、昔から自分で作りためた単機能のスクリプトは、クイックアクションで現代のmacOSでも活きると感じてました。

 

でも、どうやれば、自分でクイックアクションを作れるのか。何となく、調べもしないまま、月日が経ちました。

 

たぶん、Automator。

 

Automatorを使えば、macOS時代のサービスに対応した自作のスクリプトが作れるのではないかと、重い腰を上げてみることにしました。

 

普段は全く使ってなかったAutomatorを起動して、新規書類の一覧を見たら、あっけなく、その機能がありました。

 

 

欲しかったそのまんまの書類=「クイックアクション」対応のファイルが作成可能みたいです。

 

 

 

では、実際にどうするのか。

 

私のプチスクリプトはAppleScriptで実行可能になっていますので、そのスクリプトの中身を移植すれば良いのですが、単純にコピペすれば良いって話でもなさそうです。

 

いろいろ試した結果、「こうすれば良い」というのがわかりましたので、ここでご紹介。

 

自分で作ったクイックアクションは、自分のライブラリの「Services」に保存されます。

 

 

Finderは自動でServicesの中のクイックアクションを認識するはずです。しかし、クイックアクションの内容に合わせて提供する仕組みなのか、単純に保存しただけではクイックアクションのメニューに表れません。

 

右クリックしてクイックアクションを呼び出しても、「てすと」が表示されません。

 

 

Finderが処理すべき内容であることを、クイックアクションのオプションで指定する必要がありそうです。

 

以下のように設定してみました。

 

 

そしたら、出ました。

 

クイックアクションの仕組みにおいて、どのアプリのどんな項目が対象かを、上図のオプションで指定すれば、Finderでファイルやフォルダを選択した状態のクイックアクションのリストの中に表示されます。

 

 

 

クイックアクションは、どのアプリケーションでどのオブジェクトが対象かを、それなりにちゃんと判断するので、ファイルやフォルダを対象とするのなら、「認識させるためにも」上述のオプション指定は必須になる‥‥みたいですネ。

 

たとえ選択項目を処理する場合(=ファイル選択のプロンプトを経なくても)は、「自動(ファイルまたはフォルダ)」を選んでおくと良いみたいです。

 

Finder上でファイルやフォルダを選択した時点で、入力ソースの指定は終わっていますので、「このアクションの入力を無視」にしてもちゃんと正常に処理が進行します。

 

 

ちなみに、サブルーチンも使えます。いつも通りに。

 

 

残念ながらpropertyは設定できるものの、前回の値を記憶せず、毎回初期化されるみたいです。その点は注意点ですかね。

 

 

 

このブログに掲載する画像は、必ずJPEGに変換してアップロードするのですが(WikipediaやAmazonは直接リンク)、項目を選択して右クリックで簡単にJPEG変換スクリプトが呼び出せれば手軽で良いなと思っていました。

 

クイックアクションで呼び出す方法を調べぬまま今まで来て、ようやくそれが今日可能になりました。‥‥もっとはやくやっとけば良かった。

 

こんな感じに簡単に変換できるようになりました。自作のJPEG変換スクリプトを実行してみます。

 

 

 

変換後にオリジナルとペアになるように、単純に変換前のファイル名に拡張子をつけてますが、もちろん、行儀の良い名前で変換もできますヨ。

 

 

新規項目の命名規則は自分で好きなようにプログラムできます。

 

アイコンがスクエアになるのはご愛敬。最近(=Catalina)、なぜかこうなっちゃたんだよネ。原因は調べてないので知りません。アイコンを作り直す自動処理まで作らなくても、いつか改善されるんじゃないかと思ってます。

>解決しました。sips上でアイコンを追加する(-iオプション)のをやめて、Finderに任せることにしました。-iオプションで生成されるアイコンがスクエアに変形される理由は未だ不明。

 

ちなみに、JPEG変換はsipsコマンドでdo shell scriptで実行してます。つまり、Automator>AppleScript>Shellという流れです。画質とリサイズが簡単なUIで指定できるようにプログラムしてあります。TIFFやPNG、TARGAへの変換も可能です。私は昔からsipsを愛用してます。

 

 

 

Automatorは使わずにきましたが、クイックアクションへの移植だけでも、Automatorは有用だと言うことがわかりました。

 

特に、AppleScriptなりシェルなりで自動処理を自作してきた人は、右クリックでも呼び出せる便利な自動処理へと、Automatorで変換できますヨ。

 

AEPファイルを選択して、ライセンスをもたない(というか、正規版の親ライセンスを継承した)レンダリングエンジン版に、aerenderでレンダリングさせるクイックアクションも簡単に作れそうです。Automatorを経由してシェルに命令を投げれば良いだけですからネ。

 

監視レンダーはAdobeの流儀にキッチリ合わせないと動作しないですが、aerenderなら「UIと編集機能のない実行専用のAfter Effects」として動作するので、コマンドさえ使いこなせば1つのライセンスで自分なりのレンダーファームを組めます。監視レンダーに束縛されずに。

 

 

 

話はズレますが(毎度のことか)、aerenderを使って、レンダーガーデン的なものを作ろうと考えています。必要は発明の母。

 

2000年前後の再来はレンダリング事情にも及んで、もはやMacだのWinだのプラットフォームなど超えて、あらゆるマシンのリソースをレンダリングに活用しないと、4KHDR時代の新アニメ技術には間に合いません。2Kテレビ作品のレンダリング時間など比較にならないくらい、時間がかかるようになります。CS6を使っていられるのもリミットが来ましょう。

 

2020年代にAppleScriptを積極的に使おうとは思いませんが、自力開発の必要性は高まるでしょう。

 

去年見たTシャツの画像で、

 

原価で欲しけりゃ自分で作れ

 

‥‥というのがありました。その通りですネ。

 

まあ、原価とまでは言わなくても、開発能力のない集団は、どんな些細な処理でも金を支払って出来合いのアプリケーションをいくつも買い揃えて、使い分けて組み合わせる手間を負いましょう。

 

でなければ、自力開発できる能力を備えるしかないです。PhotoshopやAfter Effectsはともかく、レンダーガーデンのようなソリューションは、自分たちで作っても良いと思いますヨ。自分たちが一番使いやすいように作ることができるんだから。

 

 

 

開発の旅路に終わりなし。

 

 

 


IFS()がない

NumbersにはIFS()もないのか。う〜ん、面倒。

 

4分岐の場合、

 

=IF(条件式,TRUEの結果1,IF(条件式,TRUEの結果2,IF(条件式,TRUEの結果3,FALSEの結果4)))

 

となって、何とも読み辛いなあ‥‥。

 

しかも、0から9はA、10〜19はB、20〜29はC、30以上はD‥‥みたいな場合は、$A2を参照する場合、

 

IF($A2>30,"D",IF(AND($A2<30,$A2≥20),"C",IF(AND($A2<20,$A2≥10),"B","A")))

 

‥‥って、めちゃくちゃ読みにくいです。

*正確には、「どれにも当てはまらない場合は"A"」ですネ。-10で空白でもAになります。Numbersの場合、エラーが返ると、"D"になるようです。

 

どれがどのかっこ閉じか、書いてて解らなくなります。

 

Numbersは関数の追加更新が弱いですネ。こんな時は、Googleスプレッドシートに移行したくなりますが、ユーザの保守ではどうにも手出しできないのが、ネットのサービスです。最近、ジオシティーズもYahooブログも終了して、データが閲覧不能となったのは記憶に新しいところです。確実なのは自分のローカルに保存しておくこと‥‥です。

 

時代についていけなくなっても、最悪、マシン環境一式をアップデートせずに隔離して保全すれば、データの吸い出しができますもんネ。

 

Googleが「や〜めた。終了!」と言っても、ローカルのソフトウェアなら、即崩壊にならずに済みます。ネットサービスは本体ではなく、エイリアスくらいの気持ちで使うのが適当だと感じます。

 

あてにならないネットに頼るよりも、ローカルのNumbersでも入れ子でIFS的な処理は可能なので、今は我慢して使います。

 

 


TEXT()

しばらく経つとすぐに忘れる、NumbersにTEXT関数が存在しない件。

 

TEXT関数とは、1や15や209などの数値を、0001, 0015, 0209 ‥‥に書式を揃える表計算の関数です。

 

何か、代わりになるものはないかと、検索をしてはみるものの‥‥。

 

ないもんはない。

 

ならば、他の言語の時のように、自分で工夫して「桁揃え」を作れば良いです。

 

‥‥って、似たようなことを以前、このブログでも書いた記憶があるなあ‥‥。

 

 

 

例えば、行番号を2020年の末尾「20」と組み合わせて、「20-001」にしたければ、

 

"20-"&RIGHT(1000+ROW(),3)

 

もしヘッダ行で既に1行使っていて、カウントを1つ差し引きたければ、

 

"20-"&RIGHT(1000+ROW()-1,3)

 

ですネ。

 

暗黙の型変換で、1001は"1001"となり、右から3文字抜き出せば、"001"ですわ。原始的な方法。

 

もう20年前以上から、各言語でこのやりかたで桁数を合わせています。どんな言語でも使えます。

 

ちなみに、1000を作り出す場合は、10^3、つまり表計算だとPOWER関数を使って、

 

POWER(10,3)

 

で、桁数から1000や10000を作りだすことができます。3桁の000を作る時は、10を3乗して先頭の1を削れば000が生成できます。

 

なので、表の2行目から、20-001=3桁の001, 002, 003...を作り出す場合は、

 

"20-"&RIGHT(POWER(10,3)+ROW()-1,3)

 

ですネ。

 

まあ、明らかに、TEXT関数のほうが文字が短くてスッキリしてますが、Numbersにはないんだからしょうがない。

 

 

 

年末に、次の年の表計算へと更新する際に、BD-Rの一覧などで001, 002, 003...という書式が必要になるのです。ゆえに、年末にいつも、TEXT()でひっかかっている気がします。

 

私は数年来、Numbersをデータベース代わりにして、ディスクなどの整理をしています。個人レベルの整理整頓や記録には、データベースのサーバを立てるよりも、表計算で記録したほうが手軽です。簡単に内容を検索できますし、ソートも簡単、変換が必要になった際はTSVか何かで書き出せば済みますしネ。

 

 

 

 

私は1年でだいたいBD-Rを100枚くらい焼いているようなので(Numbersで記録して自覚しました)、データベース的には大した件数ではないです。

 

ただまあ、整理整頓の記録云々より、こうして焼いて保存して管理しているBD-RやDVD-Rのビデオって、見たいと思った時に果たして再生装置が健在か、ディスクの状態は良好か、もしかしたら、未来的に見れないディスクを焼いて保存するという、ものすごく無意味なことをしている予感もします。

 

しかし、テレビを年がら年中見ているような生活ではないので、見たいと思っている番組は、後で見る「可能性」のために、とりあえず保存するしかないです。

 

ちなみに、私のソニー製のBDレコーダーは、なぜかソニーブランドのBD-Rがほぼ全滅(=「フォーマットできない」と拒否される)、相性が良いのは、ビクターと三菱(バーベイタム)です。アマゾンの商品レビューを読むと「ビクターはダメ」「三菱ダメ」とみんな状況が激しく異なるんだなあ‥‥と、相変わらずの「相性」問題に少し気が重くなります。

 

*「相性」‥‥とか、2020年になっても、そんなこと言ってのるのは、ちょっと情けない。ディスクのブランドは、まさに「賭け」そのものです。

 

 

バーベイタムのBD-Rは安くていいですが、2020年代はいわゆる4層だか5層だかの128GBのBD-Rも普及するのかな??

 

円盤がそもそも存続するのか、未来は予測できない部分も多いですが、大容量化の波はこれから先もどんどん進行していくんでしょうネ。

 

 


スクリプトの刑に処す

作業が活気付いてくると、日々の雑事はたとえ些細なレベルでも面倒で厄介です。ちょいちょい作業の腰を折るので。

 

現在、新しいタイプの作画技術ではタイムシートをクラウドの表計算で記しています。一方、原画上がりに相当する作画上がりはPSDファイルのレイヤー構造で、規則(階層や名称など)を定めてファイルを出力しています。

 

つまり、PSDファイルのレイヤー構造は、セル重ねの構造であり、彩色作業枚数でもあります。

 

新しい技術ではもはや「ABCDE」というセルの名称は廃止し、実際のキャラの略語で表し、各パーツと内容を、レイヤー名で記しています。

 

例えばタローの顔と髪の毛の線画なら、

 

taroというレイヤーセットの

face.line

hair.line

 

‥‥といった具合です。

 

これらは、アクションシート上では、

 

taro as contents

face as Obj ID

hair as Obj ID

 

‥‥のように表記されます。‥‥‥というか、そのように記述しなければ、次の工程の作業者が理解できません。ちゃんと階層構造も名前も正確に記さなければ、「これは誰の髪の毛?」ということになります。

 

‥‥まあ、絵の内容を見れば、彩色作業者さんは良きに計らってくれるのですが、だからといってレイヤー名やレイヤー構造や伝票の表記を滅茶苦茶なまま渡してしまうのは、甘え過ぎを通り越して未来の作業体制の不安にもなりましょう。

 

ちゃんと規定して整然と取り回すフローを確立するのは、コンピュータを導入した後だからこそ、改めて、重要な取り組みとなります。

 

 

とはいえ。

 

こうした事務的な「レイヤー名 to 表計算の記述」を手作業でやると、地味に面倒。

 

大した所要時間ではないですが、文字を打ち間違えないように神経を使いますし、もしかしたら、レイヤー名を書き写し忘れる人災も起こりましょう。

 

そんな雑事は、

 

スクリプトの刑に処す

 

‥‥です。コンピュータの一番得意な、1文字も間違えずにコピペする能力を使わない手はないです。

 

Photoshopのレイヤー名を順々に取得して、promptのテキスト欄に書き出せば、後はコピーして、表計算に「内容だけペースト」すれば、一番面倒な「レイヤー名を書き写す」作業を自動化できます。

 

まあ、一番良いのは、そもそもアクションシートと連動してAfter EffectsやPhotoshopが動作することなのですが、今はそんなに欲張らずに、地道に面倒な手間を軽減することで確実にミスと時間消費を抑えます。

 

 

エレガントな統合作業環境を目指すのは、見果てぬ夢として抱き続けて、今は、とにかく人の時間を奪う雑事を、「思いついたらスクリプト」でプチ自動化して、どんどん新しい取り組みによる映像制作を進めましょう。

 

単に第1階層のレイヤー名だけを取得するなら、

 

var adys=app.activeDocument.layers;
var text="";
for (var i=0;i<adys.length;i++){
    text=text+adys[i].name+"¥r";
}
prompt("レイヤー名の一覧です",text);

 

‥‥と、改行(バックスラッシュとアール)で区切ったテキストを生成できます。

 

まあ、このままだと、フレームのレイヤーや使わないレイヤーや背景レイヤーまで取得しちゃいますので、visibleを使うなり、レイヤーセットで仕分けるなり、名前で判別するなり、適宜工夫して「使えるスクリプト」に変えます。

 

動作の様子は、以下のスクリーンショットのごとく。

 

 

*プロンプトの見た目は1行ですが、改行して下に連なっています。

 

*サンプルのスプレッドシートです。実際は、作業用アクションシートとしてのスプレッドシートの見た目になっています。

*実際はドット以下の「.line」をsplitで削除して、項目名だけ書き込んでいます。「hair」「face」というように。

 

 

 

こんな簡単なスクリプトでも、もしレイヤーが20個あって、そのレイヤー名をスプレッドシートなどの伝票に書き写さなければならない時は、手作業と自動処理で格段の差が出ます。自動処理なら、楽な上にミスも皆無です。

 

HTMLのテーブルや、TSVやCSVでよければ、直にファイル出力することまで、Adobeのスクリプトで可能です。

 

スクリプトは覚えて損はないので、思い立った時に、自分の力で覚えましょう。

 

 

 

毎日毎日、線画ばかり描いて、雑事に振る時間があったら、休息に充てたいです。

 

本業をちょいちょい阻害する雑事は、スクリプトの刑に処すのが一番です。

 

 

 


やる、やらない

プログラムを身近な存在にするには、まずはスクリプトを常用して、日々の作業の補助に役立てるのが良いです。

 

After EffectsやPhotoshopなら、ESTK。

 

システム関連ならShellスクリプト。

 

macOS特有ならAppleScript。

 

これだけでも、相当便利になります。Windowsの場合は、何がShellやAppleScriptの代わりになるかは、私はよくわかりませんので調べてみてください。

 

ある程度慣れてきたら、いよいよGUI付きの「ソフトウェア」っぽいものにチャレンジします。macOSだとXcodeという開発環境が無償で提供されており、macOSだけでなく今はむしろiOSの開発環境として活用されています。

 

さすがに、ソフトウェアともなると色々と大変になってきて、起動と終了の動作(初期設定の読み書き)から始まって、ウィンドウを作ってその中にリストボックスやボタンやプログレスバーやプルダウンメニューなどを配置し、それらパーツの動作に関するプログラムを個別に書いて、時にはマウスのイベント(マウスが上に来た、マウスが動いた、マウスのボタンがクリックされた‥‥とか)に対してもプログラムを書き、さらにはApplication Supportの中に自作のライブラリを追加したり、管理者権限を求めたり‥‥と、一気にやることが肥大化します。

 

なので、まずは欲張らずに、日々の作業を地道に軽減してくれるスクリプトから作って、いつでも使えるようにしておきます。デスクトップのメニューから呼び出せるようにしたり、ドックに収納するのも手軽です。

 

*Finderのスクリプトメニューから呼び出す方法

*このブログに画像を掲載する時に活躍するのが、何らかの画像ファイル形式をJPEGに変換するスクリプトです。Photoshopのバッチとかだと大袈裟過ぎますもんネ。

 

 

いまどき、AppleScriptを覚え出すのはナンだなあ‥‥とも思うので、AppleScriptは「窓口」にして、Adobeスクリプト(JavaScriptの独自拡張)やShellスクリプトを実行するのが良いかも知れませんネ。「do script」を使って、AppleScriptは単に窓口に徹して、左から右へと受け渡します。

 

「電力関連を求める」「dpiを求める」ようなスクリプトも上の図にはあります。AdobeスクリプトもShellも必要ない、単純な数式の計算も、スクリプトを作っておくと便利です。

 

ワットとボルトとアンペアの関係なんて、私ら映像制作の人間は覚えてもすぐに記憶が曖昧になりますから、スクリプトを作っておけばいつでも値を確認できます。対話式の簡素なウィンドウで事足りるので、インターフェイスビルダーの助けも不要です。

 

 

 

単純な数値計算といえば。

 

dpiの計算は、スキャンが絡む現場には必須です。ペーパーレスだとピクセル寸法だけでも事足りますが、まだまだ「スキャン解像度」の必要性は高いです。

 

dpiの計算は単純な内容ですが、「インチって何ミリだったっけか」「寸法あたりのピクセル数を求めつつ、インチとミリの変換も混ぜ‥‥」となると、よほど日々頻繁に計算する立場でもない限り、曖昧になりがちです。ゆえに、スクリプトで作っておきます。

 

 

1つ1つのスクリプトは他愛ない内容でも、作って貯めておけば、便利でしょ?

 

こうしたスクリプトをいくつも作る過程で、どんどんプログラムに対する「別の世界のものごと」感が薄れ、日々の作業の単なる1要素まで身近になってきます。

 

それこそ、5000円を三人で割り勘すると、

 

alert(5000/3);

 

‥‥なんていうところからスタートしても良いわけです。

 

今、目の前にあるのは、「プログラムをやる」と「やらない」のシンプルな2択だけ、です。

 

 


0001の作り方

皆さんは、「0001」を作る時、どんな風にしているのだろう。‥‥という疑問が昔からあります。私はスクリプトやプログラムは我流なので、「定番」というのをよく知らないのです。

 

「任意の整数に、任意の桁のゼロを追加する時」に、どんな方法があるのか、他人さまのコードを探して見たことがないので、定番というか、定石がわかりません。プログラムが本職の現場に居たこともないですし。

 

どこかで見かけたのは、1を「1」にキャストして文字数を数えて、if分岐で "0", "00"," 000" のいずれかを加える‥‥という方法でしたが、それはあまりにも面倒なように思います。8桁だったら、if分岐で7回書くことになりますし、ifを使わずに繰り返し文で足りない0を加えるのもちょっと面倒です。

 

改めて探したら、"00"や"000"を足す方法を解説しているページも検索できましたが、やっぱりちょっと面倒ですよネ。

 

 

 

私がもう随分前〜20年前くらいから使っているのは、10に欲しい桁数を冪算(累乗)したものを足す方法です。

 

桁のゼロで揃えたい。

10の乗は、10000。

10000に1を足して、10001。

先頭の桁数をカットすれば、0001の出来上がり。

 

‥‥という感じです。

 

JavaScriptですと、

 

var numberOfDigits=4;
var currentValue=1;

var result=String((Math.pow(10,numberOfDigits))+currentValue).slice(1);

alert(result);

 

‥‥で、以下。

 

JPEG_1.jpg

 

桁数の変更は如何様にでも。

 

例えば、8桁なら‥‥

 

var numberOfDigits=8;
var currentValue=1;

var result=String((Math.pow(10,numberOfDigits))+currentValue).slice(1);

alert(result);

 

JPEG_4.jpg

 

‥‥です。

 

 

 

この我流の方法=「10に桁数で累乗する方法」は、桁固定ではなく、もともとは桁の可変を実現するために考えたものでした。

 

例えば、ファイル総数が130ファイルだった場合は4桁ではなく3桁に、10250だった場合は5桁に‥‥と、状況に応じて変動させたい場面に対応するために、うんうん考えた末に冪算で0を生成する方法に至りました。

 

例えば、総数が72だった場合は、

 

var maxValue=72;
var currentValue=8;

var result=String((Math.pow(10,String(maxValue).length))+currentValue).slice(1);

alert(result);

 

JPEG_2.jpg

 

‥‥と、ちゃんと2ケタになりますし、総数が1200だった場合は、

 

var maxValue=1200;
var currentValue=8;

var result=String((Math.pow(10,String(maxValue).length))+currentValue).slice(1);

alert(result);

 

JPEG_3.jpg

 

‥‥と、ちゃんと4ケタになります。

 

なぜ、この「可変桁数」が必要だったかは、もう20年前のことなので忘れちゃったのですが、ともあれ、"0000"と固定せずに可変でゼロで揃えるニーズに対応するために、POWER()、Math.pow()、 「^」(=AppleScriptでの冪算の記号)を用いてヒネりだしました。

 

自作のAppleScriptによる「リネームスクリプト」でも、このルーチンは使っていまして、

 

JPEG_5.jpg

JPEG_6.jpg

 

‥‥と、4ケタと自動設定が選べるようになっています。

 

 

 

ちなみに、エクセルやGoogleスプレッドシートだと、4桁揃えの場合、

 

TEXT(なんらかの数値,"0000")

 

‥‥で済むという、超便利なTEXT()関数があるようですが‥‥、NumbersにはTEXT()がなーい! なじぇ?

 

 

 

macOSのNumbersでは「TEXT()」関数が無いようなので、以下のごとく。

 

 

RIGHT()関数で、数値を「暗黙の型変換」で文字列として扱いつつ右から4文字取り出す‥‥という方法で、難なくクリア。どんなスクリプトやプログラムにも実践方法はありますネ。

 

 

今回の記事を書くにあたって、皆さんの方法を漁ってたら、「とりあえず0をあらかじめいっぱい付けておいて、「substr」(sliceでも)で簡単に切り出す」方法を紹介していて、感じ入りました。

 

var numberOfDigits=4;
String(100000000+1).substr(9-numberOfDigits);

 

実質、最大8ケタもあれば実用に耐え得るので(映像制作の場合)、9桁固定の方法でも充分対応できますネ。

 

 

 


レイヤー名をナンバリング

ProcreateからPhotoshopに持ち込むと、レイヤー名が文字化けする。

 

‥‥開発元にフィードバックすれば良いのかな。単純な文字コードの問題ですよネ。

 

私は今はもっぱら手短なスクリプトばかり作ってますが、昔はIDE(って、今でも言います? 統合開発環境)を使ってソフトウェアを(稚拙なりにも)作っていたので、文字コードの扱いは厄介でした。テキストストリームの時に文字コードをちゃんと指定しないと、必ずと言って良いほど文字化けしてました。MacOSとOSXの端境期でしたので、SJISとUTFが入り乱れていたのです。

 

昔話はともかく、今すぐにはProcreateは治るまい。

 

まあ、Procreateに限らず、「名称未設定1」,2,3,4,....を1発リネームしたいことはありますよネ。作業の合間にこまめにリネームすれば良いんでしょうけど、矢継ぎ早に頭の中のイメージを描きまくる時はレイヤー名など御構い無しにテンポを落としたくないこともあります。

 

レイヤーフォルダ内のレイヤーのうち、可視状態のものだけをリネームするスクリプトは、あればあったで使い道はありそうです。

 

なので、早速作る。凄く簡単なのを。

 

*注意* スクリプトを実行する場合は、テストファイルで実行して動作を確認してください。あくまで「自己責任」で。

 

alert(main());

 

function main(){
    var ls=app.activeDocument.activeLayer;
    if (ls.typename!="LayerSet"){return ls.name+"は処理対象ではありません";}
    
    var layerList=[];

    for(var i=0;i<ls.layers.length;i++){if(ls.layers[i].visible){layerList.push(ls.layers[i]);}}//処理するレイヤーをリストアップ
    var num=Math.pow(10,String(layerList.length).length);//リネームする総数に応じて桁数を設定
    for (var i=0;i<layerList.length;i++){layerList[i].name=ls.name+"-"+(String(num+layerList.length-i).slice(1));}
    
    return String(layerList.length)+"レイヤーを連番リネームしました";

}

 

 

これを実行すると、こんな状態のが‥‥

 

 

‥‥以下のように、連番で下からリネームされます。

 

 

 

 

処理対象は、レイヤーフォルダの直下にある「レイヤー」(=ArtLayerとLayerSetの見境なし)です。ゆえに、フラット化したレイヤーだけでなく、複数レイヤーをまとめたレイヤーフォルダもそのままリネームします。‥‥たぶん(=試していない)。

 

リネームの基準を、「セル名+4桁連番」に固定したい場合は、以下のようなスクリプトで。

 

4桁固定だと、総数をあらかじめ取得する必要がないので、スクリプトの趣向も変えています。

 

alert(main());

 

function main(){
    var ls=app.activeDocument.activeLayer;
    if (ls.typename!="LayerSet"){return ls.name+"は処理対象ではありません";}

 

    var num=10000;//桁数を4桁に固定
    for (var i=0;i<ls.layers.length;i++){
        var lyr=ls.layers[ls.layers.length-1-i];//下のレイヤーから順番に処理
        if(!lyr.visible){continue;}//処理対象外(不可視)の場合はスキップ
        num++;
        lyr.name=ls.name+""+(String(num).slice(1));
    }
    
    return String(Number(String(num).slice(1)))+"レイヤーを連番リネームしました";
}

 

 

結果は、以下の通りです。

 

 

 

 

visible=可視〜「目玉」のアイコンを消しておけば、連番の処理対象から外れるので、任意のレイヤーのみ連番リネームできます。

 

 

 

 

この作業を、手作業でキーボードで打ち変えていたら、大した内容ではないですが、面倒で地味に時間を消費します。

 

人手だと地味に手間がかかる雑事を、10行程度の命令文を書いてコンピュータで実行するだけで、コンピュータは何の文句も不平も言わずに、超高速で片付けます。まさにコンピュータを使っている「わかりやすい利点」です。

 

 

 

現場の改革の要素は、ビッグなものからスモールなものまで、色々あって悩ましいです。

 

たとえ、将来に作業環境と待遇が改善されても、自分たちが「今欲しい」スクリプトは誰も作ってはくれません。スクリプトを書く知識を得れば、PhotoshopやAfter Effects、macOSやWindowsなどの様々な雑事を自動化できます。

 

でもって、スクリプトが思い通りに動作して、自分の雑事が軽減されると、何とも「愉快」。

 

実はスクリプトやプログラムは、面白いんです。‥‥ピタゴラスイッチのようなものですからネ。

 

 


スクリプトの機能プチ追加

以前作った「Photoshopのレイヤーを順々に書き出す」スクリプトは、実はアニメ作画以外でも結構重宝しています。何かと、Photoshopのレイヤーを個別のファイルに書き出したい場面はあるもの‥‥ですネ。

 

 

 

 

以前載せたこの模式図は、一部省略してありまして、「常時表示するレイヤー」などは図中にありません。

 

実際にスクリプトを作ってみればわかることですが、レイヤーを順次書き出すだけではあまり役に立たないのです。

 

静止画(止め絵)として書き出すレイヤー

レイヤーフォルダにまとめた、イメージシーケンスとして書き出すレイヤー

レイヤーフォルダにまとめているが、静止画として個別に書き出すレイヤー

常時表示するレイヤー

 

最低これらを処理できないと、「線画だけ描いて白地やフレームは他のレイヤーを使いまわし」などの作業省略方法が効きませんもんネ。

 

 

スクリプトは必要に応じて、機能を付け足して強化できます。これが自分でスクリプトを作る醍醐味でもあり、スクリプト・プログラム能力を兼ね備えた作業集団の強みでもあります。

 

現在の仕様では、当座のニーズに合わせて、TGAを書き出す仕様です。それでは、ちょっと限定的‥‥というか、使い道が限られます。

 

なので、TGA、TIFF、PSD(統合した)、JPGくらいの選択肢はあっても良いですよネ。

 

 

リストからプルダウンして選ぶファンクション(1発で呼び出せるヤツ)って、ありませんでしたっけ? ‥‥まあ、ないのか。しょうがないので、windowオブジェクトからいちいち作りました。う〜ん、コードでGUIを記述するのは面倒。

 

AppleScriptなら「choose from list」で済むんですけどネ。ESTKのエディタだけでなく、インターフェイスビルダーが欲しい。

 

どうせなら、ファイル形式だけでなく、書き出し場所の指定も‥‥とか、機能を増やしたくなりますが、前回指定した項目や場所を覚えておくにはプリファレンスの仕組みも必要だし、何だか地味に規模が広がっていくので、欲張りはナシに。

 

でもまあ、この程度のスクリプトでも、無いよりはあったほうが百倍マシです。実際、手作業でレイヤーを書き出してたら、日が暮れます。

 

 

どんなにソフトウェアが充実しても、スクリプトの必要性は全く薄れないでしょう。

 

絵を描くのは、ラスターだろうがベクターだろうが、線を1本1本、手作業で然るべし。そこを放棄したら、絵描きではなくなります。絵描きを名乗れない。

 

でも、ファイルの書き出しを1ファイルごと手作業ではなく自動処理しても、絵描きでなくなるわけがないです。むしろ、そういう手間はどんどん自動化して、もっと絵に精進するか、自動化で浮いた時間は帰宅して明日のために寝ましょう。

 

目下の課題は、アニメーターをはじめとした作業集団の内部に、どうやってスクリプト修得者を獲得するか‥‥です。皆、「難しいから」とか言って、やらんもんなあ‥‥。時間の有無以前に、敬遠したり、嫌がったりするでしょ。時間があっても、プログラムは覚えない人が圧倒的多数だもんね。

 

う〜ん。絶対に必要なんだけどネ。内部には。

 

 



calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
262728293031 
<< January 2020 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM